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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:42:23