You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 12:54:09