gpt4 book ai didi

python - 使用多线程时是否应该保护内置数据结构(列表、字典)?

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:12 25 4
gpt4 key购买 nike

我认为在使用多线程时应该使用Lock对象来保护自定义类,但是,因为Python使用GIL来确保在任何给定时间只有一个线程在运行,这是否意味着不需要使用Lock来保护内置类型如列表?例如,

num_list = []
def consumer():
while True:
if len(num_list) > 0:
num = num_list.pop()
print num
return

def producer():
num_list.append(1)

consumer_thread = threading.Thread(target = consumer)
producer_thread = threading.Thread(target = producer)
consumer_thread.start()
producer_thread.start()

最佳答案

GIL 保护解释器状态,而不是您的状态。有一些操作实际上是原子的——它们需要单个字节码,因此实际上不需要锁定。 (请参阅 is python variable assignment atomic? 以获取来自非常有信誉的 Python 贡献者的答案)。

不过,实际上并没有任何关于此的好的文档,因此我一般不会依赖它,除非您计划反汇编字节码来测试您的假设。如果您计划从多个上下文修改状态(或修改和访问复杂状态),那么您应该计划使用某种锁定/同步机制。

如果您有兴趣从不同的角度解决此类问题,您应该查看 Queue模块。 Python 代码中的常见模式是使用同步队列在线程上下文之间进行通信,而不是使用共享状态。

关于python - 使用多线程时是否应该保护内置数据结构(列表、字典)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com