python 多线程笔记(2)-- 锁

简介:

锁是什么?什么场合使用锁?

锁是一种机制,用于保护那些会引起冲突的资源。

 

比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中!

至于在厕所里面干大事、干小事、还是打飞机,都可以!

完事之后干嘛?把厕所门打开!表示什么呢?那谁,你可以进来打飞机了。

 

一、全局锁、函数内部上锁/解锁、函数打包进线程

复制代码
import threading
import time


def my_func(num):
    global counter, mutex
    # 获得线程名
    threadname = threading.currentThread().getName()
 
    for i in range(num):
        mutex.acquire()         # 锁住①
        counter = counter + 1   # 保护②  如同厕所坑位是抢占性资源,同一时间只能一个人去蹲
        mutex.release()         # 解锁③
        
        print(threadname, i, counter)  # 再回去,坑位counter可能已被其它人蹲过
        time.sleep(1)
 

if __name__ == '__main__':
    
    counter = 0 # 计数器
    
    mutex = threading.Lock() # 创建锁
    
    threads = []
    for i in range(4):
        threads.append(threading.Thread(target=my_func, args=(10,))) # 创建线程
        
    for t in threads:
        t.setDaemon(True)       # 守护
        t.start()               # 启动线程
        
    for t in threads:
        t.join()                # 阻塞主程,直到线程退出
复制代码

 运行效果图:

可以发现到 counter 并不是顺序显示的,看官可以思考其原因。

 

 二、全局锁、线程类、线程类run方法中上锁/解锁

复制代码
import threading
import time


class Worker(threading.Thread):
    '''线程类'''
    def __init__(self, num=5):
        super().__init__()
        self.num = num
 
    def run(self):
        global counter, mutex
        threadname = threading.currentThread().getName()
 
        for i in range(self.num):
            mutex.acquire()         # 锁住①
            counter = counter + 1   # 保护② 如同厕所坑位是抢占性资源,同一时间只能一个人去蹲
            mutex.release()         # 解锁③
            
            print(threadname, i, counter)  # 此时,counter可能又已被其它线程改变
            time.sleep(1)

    
if __name__ == '__main__':
    # 全局计数器
    counter = 1
    
    # 创建锁
    mutex = threading.Lock()
    
    # 创建线程对象
    threads = []
    for i in range(4):
        threads.append(Worker(10)) # 添加 4 个 Worker
        
    # 启动线程
    for t in threads:
        t.start()
        
    # 阻塞主程
    for t in threads:
        t.join()
复制代码

 

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/5178157.html ,如需转载请自行联系原作者
相关文章
|
10月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
10月前
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
317 0
|
10月前
|
编解码 数据安全/隐私保护 Python
抖音批量发布视频工具,自动上传视频作品笔记,python发布软件
这个抖音批量发布工具包含三个主要模块:主上传程序、配置文件和视频预处理工具。主程序
|
7月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
435 1
|
7月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
727 0
|
9月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
728 1
|
10月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
10月前
|
数据采集 存储 Java
多线程Python爬虫:加速大规模学术文献采集
多线程Python爬虫:加速大规模学术文献采集
|
10月前
|
API 数据安全/隐私保护 Python
小红书批量发布协议, 抖音自动批量发布软件脚本,笔记作品视频自动发布工具【python】
这个工具框架包含了小红书和抖音的批量发布功能,支持图片和视频处理、定时发布等功能
|
10月前
|
Web App开发 数据安全/隐私保护 Python
抖音快手小红书哔哩哔哩,批量发布作品笔记视频工具,自动发布作品上传笔记视频【python】
这个工具实现了四大平台的视频批量上传功能,包含完整的异常处理和日志记录。使用时需要配置

推荐镜像

更多