是python中的list.pop线程安全

时间:2016-10-28 18:51:23

标签: python multithreading

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我的答案是 - 要获取多个线程一次使用的全局列表的元素输出(弹出),是线程安全的 < / em>的

原因是因为它是原子操作

一次一个操作是原子操作。

选中link

从上方链接

  

作用于共享内存的操作如果在a中完成则是原子操作   相对于其他线程的单步。当一个原子商店是   在共享变量上执行,没有其他线程可以观察到   修改半完成。当对a执行原子加载时   共享变量,它读取单个出现的整个值   这一刻。非原子载荷和商店不会产生这些   保证。

列表上的任何操作都不会成为原子操作,因此需要特别注意使用锁定,事件,条件或信号量等使其线程安全。 这在Are lists thread-safe这里解释。