如何同步python列表?

Sha*_*han 5 python multithreading

我有不同的线程,在处理后,他们将数据放在一个公共列表中.是否有任何内置在python中的列表或numpy数组只能由一个线程访问.其次,如果不是这样做的优雅方式呢?

lvc*_*lvc 5

根据Python中的线程同步机制,可以保证从列表中读取单个项目并在适当位置修改列表是原子的。如果这是正确的(尽管似乎与Queue模块的存在部分抵触),则您的代码是所有形式的:

try:
   val = mylist.pop()
except IndexError:
   # wait for a while or exit
else:
   # process val
Run Code Online (Sandbox Code Playgroud)

并且所有的mylist操作都由完成.append(),那么您的代码已经是线程安全的。如果您不信任该文档中的某个文档,请使用queue.queue,它可以为您完成所有同步操作,并且具有比list并发程序更好的API- 特别是,它使您可以选择无限期阻塞或超时,.pop()如果没有其他东西,则等待工作,与此同时线程可能继续运行。

对于numpy数组,通常在任何情况下,您需要的不仅仅是生产者/消费者队列,请使用a LockRLockfrom- threading这些可实现上下文管理器协议,因此使用它们非常简单:

with mylock:
    # Process as necessarry
Run Code Online (Sandbox Code Playgroud)

并且python将确保一旦您掉到with块的末尾,便会释放该锁-包括在棘手的情况下,例如您所做的事情引发异常。

最后,考虑是否multiprocessing比您的应用程序更适合threading-不能保证Python中的线程可以真正并发运行,而在CPython中,只有降级为C级代码时,线程才能保证并发运行。multiprocessing解决这个问题,但可能会产生一些额外的开销-如果您尚未解决此问题,则应阅读文档以确定哪个文档更适合您的需求。


srg*_*erg 1

标准库Queue怎么样?