线程锁(Python)
一、多个线程对同一个数据进行修改
from threading import Thread,Lock n = 0 def add(lock): for i in range(500000): global n with lock: n += 1 def sub(lock): for i in range(500000): global n with lock: n -= 1 t_l = [] lock = Lock() for i in range(2): t1 = Thread(target=add,args=(lock,)) t1.start() t2 = Thread(target=sub,args=(lock,)) t2.start() t_l.append(t1) t_l.append(t2) for t in t_l: t.join() print(n)
二、多个线程对同一列表进行操作
from threading import Thread,Lock import time n = [] def append(): for i in range(500000): n.append(1) def pop(lock): for i in range(500000): with lock: if not n: time.sleep(0.0000001) # 强制CPU轮转 n.pop() t_l = [] lock = Lock() for i in range(20): t1 = Thread(target=append) t1.start() t2 = Thread(target=pop,args=(lock,)) t2.start() t_l.append(t1) t_l.append(t2) for t in t_l: t.join() print(n)
三、单例模式创建对象加锁
import time class A: from threading import Lock __instance = None lock = Lock() def __new__(cls, *args, **kwargs): with cls.lock: if not cls.__instance: time.sleep(0.000001) # cpu轮转 cls.__instance = super().__new__(cls) return cls.__instance def func(): a = A() print(a) from threading import Thread for i in range(10): Thread(target=func).start()
拓展
#拓展知识(将函数执行过程的底层指令打印出来) import dis a = 0 def func(): global a a += 1 print(dis.dis(func)) ''' 锁 0 LOAD_GLOBAL 2 LOAD_CONST 4 INPLACE_ADD # GIL锁切换了 6 STORE_GLOBAL 释放锁 '''
总结
1:不要操作全局变量,不要在类里操作静态变量 2:+= -= *= /= if while 数据不安全 3:queue logging 数据安全的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~