如何实现Python多线程之间的通信与数据共享?
问题原因与解决方案
问题根因
- 全局变量作用域问题:Python中函数内修改顶层定义的全局变量时,必须显式用
global关键字声明。你当前代码中thing1里执行s += 1时,Python会默认将s识别为thing1的局部变量,既无法修改全局的s,实际运行还会抛出UnboundLocalError异常。 - 线程执行时序问题:你在
thing1中设置了1秒延时,两个线程启动后thing2会优先执行,此时thing1还未完成对s的修改,自然会打印初始值0。
修复代码(基础版)
import time import threading s = 0 def thing1(): global s time.sleep(1) s += 1 def thing2(): t.join() # 等待thing1线程执行完毕再读取s的值 print(s) t = threading.Thread(target = thing1) t.start() t2 = threading.Thread(target = thing2) t2.start()
运行后会输出期望的修改后的值1。
多线程共享数据优化方案
如果要实现多个线程互相修改共享数据,更推荐用可变对象(如字典、列表)作为共享容器,不需要额外声明global,同时需要加锁避免竞态条件:
import time import threading # 可变共享容器,无需global即可跨线程修改 shared_data = {"count": 0} # 线程锁,避免同时修改导致数据异常 lock = threading.Lock() def thing1(): time.sleep(1) with lock: shared_data["count"] += 1 def thing2(): t.join() with lock: print(shared_data["count"]) t = threading.Thread(target = thing1) t.start() t2 = threading.Thread(target = thing2) t2.start()
内容的提问来源于stack exchange,提问作者Pixeled
相关产品推荐
相关产品推荐

