互斥锁
1.创建进程2.Process类语法详解3.进程间通信4.进程池5.进程间的锁和信号量6.根据进程编号杀死指定进程os.kill7.守护进程8.线程9.实现多线程多任务的步骤10.threading.Thread类详解11.守护线程&&threading.enumerate()12.python线程并行执行与java的线程并行执行的对比13.IO密集型任务与CPU密集型任务14.多线程共享全局变量的问题15.多线程共享资源之竞态条件
16.互斥锁
17.死锁18.线程池19.进程与线程的对比20.闭包21.闭包之nonlocal关键字的作用22.闭包之作用23.闭包之可能引起的问题24.弱引用25.装饰器26.装饰器示例27.property 属性28.with语句和上下文管理器详解、最佳实践、示例29.生成器30.深浅拷贝31.正则表达式在Python中,可以使用互斥锁(Mutex)来实现线程之间的互斥访问,保证共享资源的安全性。互斥锁可以确保在任何时刻只有一个线程可以持有锁,并且其他线程必须等待锁的释放才能继续执行。
步骤
1. 创建互斥锁对象:
lock = threading.Lock()
通过threading.Lock()
函数创建一个互斥锁对象。
2. 获取互斥锁:
lock.acquire()
调用acquire()
方法获取互斥锁。如果互斥锁已经被其他线程占用,则当前线程将被阻塞,直到互斥锁被释放。
3. 释放互斥锁:
lock.release()
示例
1 import threading 2 3 # 全局变量 4 g_num = 0 5 6 7 # 对g_num进行加操作 8 def sum_num1(): 9 # 上锁 10 mutex.acquire() 11 12 for i in range(1000000): 13 global g_num 14 g_num += 1 15 16 # 解锁 17 mutex.release() 18 19 print("g_num1:", g_num) 20 21 22 # 对g_num进行加操作 23 def sum_num2(): 24 # 上锁 25 mutex.acquire() 26 27 for i in range(1000000): 28 global g_num 29 g_num += 1 30 31 # 解锁 32 mutex.release() 33 34 print("g_num2:", g_num) 35 36 37 if __name__ == '__main__': 38 # 创建锁 39 mutex = threading.Lock() 40 # 创建子线程 41 sum1_thread = threading.Thread(target=sum_num1) 42 sum2_thread = threading.Thread(target=sum_num2) 43 44 # 启动线程 45 sum1_thread.start() 46 sum2_thread.start() 47 # 等待子线程结束 48 sum1_thread.join() 49 sum2_thread.join() 50 print(f"g_num最终值:{g_num}")
输出:
g_num1: 1000000
g_num2: 2000000
g_num最终值:2000000
推荐示例-with语句
1 ''' 2 在Python中,可以使用互斥锁(Mutex)来实现线程之间的互斥访问,保证共享资源的安全性。 3 互斥锁可以确保在任何时刻只有一个线程可以持有锁,并且其他线程必须等待锁的释放才能继续执行。 4 5 互斥锁使用3步骤: 推荐使用with语句 6 1. 创建互斥锁对象 7 2. 获取互斥锁 8 3. 释放锁 9 10 ''' 11 import threading 12 13 # 全局变量 14 count = 0 15 # 1. 创建互斥锁对象,定义未全局变量,让多线程共享。要保证上的是同一把锁,否则锁不住 16 lock = threading.Lock() 17 18 # 线程函数 19 def increment(): 20 global count 21 for _ in range(100000): 22 with lock: # 自动上锁、解锁 23 count += 1 24 25 if __name__ == '__main__': 26 # 创建两个线程 27 thread1 = threading.Thread(target=increment) 28 thread2 = threading.Thread(target=increment) 29 30 # 启动线程 31 thread1.start() 32 thread2.start() 33 34 # 等待线程结束 35 thread1.join() 36 thread2.join() 37 38 # 打印最终结果 39 print("Final count:", count)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能