我有不同的线程,处理后它们将数据放在一个通用列表中。python 中是否有任何内容可供列表或 numpy 数组仅由单个线程访问。其次,如果它不是一种优雅的方式呢?
3 回答
根据Python 中的线程同步机制,从列表中读取单个项目并就地修改列表保证是原子的。如果这是正确的(尽管它似乎与 Queue 模块的存在部分相矛盾),那么如果您的代码都是以下形式:
try:
val = mylist.pop()
except IndexError:
# wait for a while or exit
else:
# process val
并且放入mylist
的所有内容都由 完成.append()
,那么您的代码已经是线程安全的。如果您不信任该分数上的一个文档,请使用queue.queue,它为您完成所有同步,并且具有比list
并发程序更好的 API - 特别是,它为您提供了无限期阻塞的选项,或者超时,.pop()
如果您没有其他线程可以同时处理,则等待工作。
对于 numpy 数组,通常情况下,如果您需要的不仅仅是生产者/消费者队列,请使用 aLock
或RLock
from threading
- 它们实现了上下文管理器协议,因此使用它们非常简单:
with mylock:
# Process as necessarry
并且 python 将保证一旦你从块的末尾掉下来,锁就会被释放with
——包括在棘手的情况下,比如你所做的事情引发了异常。
最后,考虑是否multiprocessing
更适合您的应用程序threading
- Python 中的线程不能保证实际并发运行,而在 CPython 中只有在下降到 C 级代码时才能保证。multiprocessing
解决了这个问题,但可能会有一些额外的开销 - 如果您还没有,您应该阅读文档以确定哪个更适合您的需求。
标准库Queue怎么样?