Python中的list.pop方法是否线程安全?

9

假设我有一个程序,它使用随机值初始化一个列表。然后应用程序会生成一堆线程,每个线程都会从这个共享列表中弹出项目。我的问题是,这个操作是否是线程安全的:

try:
    while global_list.pop():
        ...do something ..
except:
    print ("list is empty")

线程之间的竞争条件是否会导致数据丢失?

编辑:我已经参考了链接Are lists thread-safe,但是引用的问题中对列表数据进行了操作,而我只是在谈论弹出列表项,这会修改列表而不是其中的数据。在我的代码片段中,do something并不表示对列表数据的操作,它只是一些与列表数据无关的处理。


问题已编辑,参考链接并未回答我的问题。 - john smith
1
collections模块中有一个线程安全的队列/队列,支持弹出和LIFO和FIFO模式。 - Adam Van Prooyen
再次强调,我意识到了这一点,我的问题与寻找替代方法无关,而是与列表的行为有关。 - john smith
1个回答

6
我的答案是是的 - 从全局列表中获取元素(pop),该列表被多个线程同时使用,是线程安全的
原因是因为它是原子操作一次一个操作是原子操作。 请查看此链接:链接来自上面的链接 如果在共享内存上执行操作,则如果相对于其他线程完成单个步骤,则该操作是原子操作。当对共享变量执行原子存储时,没有其他线程可以观察到修改的一半。当对共享变量执行原子加载时,它会读取整个值,因为它在某个时间点上出现过。非原子加载和存储不提供这些保证。
对列表进行的任何操作都不是原子操作,因此需要额外小心,使用锁、事件、条件或信号量等使其线程安全。在此处Are lists thread-safe有解释。

2
你链接了一堆与原子操作相关的东西,但没有提供任何证明或证据表明(至少在CPython中)列表弹出实际上是原子操作。不过,你链接的SO问题中有这个细节。 - GManNickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接