Python多线程中共享变量的正确访问方式:传参还是直接访问?
问题
在Windows 10系统、CPython 3.10+环境下,是否必须通过Thread的args参数显式传递共享变量给线程函数?还是允许线程函数直接访问共享变量?哪种方式是正确的?
第一个示例:通过args传递共享变量
import time import threading def update_list_A(var_list): var_list.append('A') shared_list = [] t1 = threading.Thread(target=update_list_A, args=(shared_list,)) # 使用args传递共享变量 t1.start() t1.join() print(shared_list)
第二个示例:直接访问共享变量
import time import threading def update_list_A(): shared_list.append('A') shared_list = [] # 共享列表 t1 = threading.Thread(target=update_list_A) t1.start() t1.join() print(shared_list)
回答
两种方式都允许且能正常运行,没有强制要求必须使用某一种,二者各有优劣:
通过
args传递共享变量- 函数耦合度更低、复用性更强:这个函数不仅能操作示例中的
shared_list,还可以接收其他列表对象进行操作 - 代码可读性更高:从函数定义和传参能直接看出函数依赖的变量,逻辑更清晰
- 降低全局变量风险:避免后续代码中意外重定义同名变量导致的逻辑错误
- 函数耦合度更低、复用性更强:这个函数不仅能操作示例中的
直接访问共享变量
- 写法更简洁:省去了传参的步骤,代码更短
- 适合多共享变量场景:当需要访问的共享变量数量较多时,不用逐个传递,减少代码冗余
重要注意点
不管采用哪种方式,多线程操作可变共享对象(比如列表、字典)时,必须处理线程安全问题。如果多个线程同时对共享对象执行修改操作,可能会出现数据竞争,导致结果异常或程序崩溃。此时需要使用threading.Lock等同步机制来保护共享资源,示例如下:
import time import threading lock = threading.Lock() shared_list = [] def update_list_A(): with lock: shared_list.append('A') t1 = threading.Thread(target=update_list_A) t2 = threading.Thread(target=update_list_A) t1.start() t2.start() t1.join() t2.join() print(shared_list) # 输出稳定为['A', 'A']
内容的提问来源于stack exchange,提问作者Rahul.In
相关产品推荐
相关产品推荐

