Sha*_*han 5 python multithreading
我有不同的线程,在处理后,他们将数据放在一个公共列表中.是否有任何内置在python中的列表或numpy数组只能由一个线程访问.其次,如果不是这样做的优雅方式呢?
根据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 Lock或RLockfrom- threading这些可实现上下文管理器协议,因此使用它们非常简单:
with mylock:
# Process as necessarry
Run Code Online (Sandbox Code Playgroud)
并且python将确保一旦您掉到with块的末尾,便会释放该锁-包括在棘手的情况下,例如您所做的事情引发异常。
最后,考虑是否multiprocessing比您的应用程序更适合threading-不能保证Python中的线程可以真正并发运行,而在CPython中,只有降级为C级代码时,线程才能保证并发运行。multiprocessing解决这个问题,但可能会产生一些额外的开销-如果您尚未解决此问题,则应阅读文档以确定哪个文档更适合您的需求。
| 归档时间: |
|
| 查看次数: |
5967 次 |
| 最近记录: |