Python多线程跨线程共享变量修改后输出异常问题咨询
问题根因
代码存在两处核心错误,导致变量无法按预期修改:
- 线程目标参数传参错误:创建
Thread实例时写target=cfg.global_cfg(),会在主线程上下文立刻执行global_cfg函数,最终把函数返回值None传给target参数。子线程启动后没有可执行的逻辑,根本不会运行你写的变量修改代码。正确传参需要传入函数对象本身,不能加函数调用的圆括号。 - 全局变量作用域不统一:两个文件中的
account是完全独立的模块级变量:main.py中定义的account属于__main__模块的全局变量,cfg.py中用global account声明操作的是cfg模块自身的全局变量,二者指向完全不同的内存地址,cfg里的修改根本不会影响main里定义的变量。
修正代码
把跨线程共享的变量统一定义在独立模块中,所有线程都从该模块导入、操作变量,同时修正线程传参写法:
cfg.py(存储共享变量+修改逻辑)
# 共享变量统一定义在cfg模块 account = 1 def global_cfg(): global account account = 2
main.py(启动线程、读取变量)
import threading import cfg import time if __name__ == "__main__": # 传入函数对象,不要加()提前调用 thread_cfg = threading.Thread(target=cfg.global_cfg, args=()) thread_cfg.start() time.sleep(5) # 读取cfg模块中的共享变量 print(cfg.account)
运行上述代码即可得到预期输出2。
内容的提问来源于stack exchange,提问作者Michael Mü
相关产品推荐
相关产品推荐

