Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中list.pop线程安全吗_Python_Multithreading - Fatal编程技术网

在python中list.pop线程安全吗

在python中list.pop线程安全吗,python,multithreading,Python,Multithreading,假设我有一个用随机值初始化列表的程序。然后,应用程序生成一组线程,每个线程不断从该共享列表中弹出项目。我的问题是,此操作是否线程安全: try: while global_list.pop(): ...do something .. except: print ("list is empty") 是否会出现由于线程之间的竞争条件而导致数据丢失的情况 编辑:我提到了链接,但是在引用的问题中有对列表数据的操作,我只是说从列表中弹出项目,这是在修改列表,而不是其中的数

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

try:
    while global_list.pop():
        ...do something ..
except:
    print ("list is empty")
是否会出现由于线程之间的竞争条件而导致数据丢失的情况


编辑:我提到了链接,但是在引用的问题中有对列表数据的操作,我只是说从列表中弹出项目,这是在修改列表,而不是其中的数据。在我的代码片段中,do some并不表示对列表数据的操作,它只是一些与列表数据无关的处理

我的答案是-要将元素从全局列表中取出(pop),该列表一次由多个线程使用,是线程安全的

原因是它是原子操作

一次一个操作是原子操作

看看这个

来自上面的链接

在共享内存上执行的操作如果在一段时间内完成,则是原子操作 相对于其他线程的单个步骤。当一个原子库 在共享变量上执行时,其他线程无法观察 修改完成了一半。当原子加载在一个计算机上执行时 共享变量时,它读取在单个 瞬间。非原子负载和存储不会产生这些问题 保证

列表上的任何操作都不会是原子操作,因此需要特别注意使用锁、事件、条件或信号量等使其线程安全。
此处对此进行了解释。

问题编辑,引用的链接没有回答我的问题。
集合
模块中有一个线程安全队列/队列,支持弹出和后进先出模式。我再次意识到,我的问题与列表的行为有关,没有找到替代方案。你链接了一堆与原子有关的东西,讨论原子的含义,但没有提供(至少在CPython中)列表pop实际上是原子的理由或证据。不过,你的问题有这个细节。