6

我有不同的线程,处理后它们将数据放在一个通用列表中。python 中是否有任何内容可供列表或 numpy 数组仅由单个线程访问。其次,如果它不是一种优雅的方式呢?

4

3 回答 3

5

根据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 数组,通常情况下,如果您需要的不仅仅是生产者/消费者队列,请使用 aLockRLockfrom threading- 它们实现了上下文管理器协议,因此使用它们非常简单:

with mylock:
    # Process as necessarry

并且 python 将保证一旦你从块的末尾掉下来,锁就会被释放with——包括在棘手的情况下,比如你所做的事情引发了异常。

最后,考虑是否multiprocessing更适合您的应用程序threading- Python 中的线程不能保证实际并发运行,而在 CPython 中只有在下降到 C 级代码时才能保证。multiprocessing解决了这个问题,但可能会有一些额外的开销 - 如果您还没有,您应该阅读文档以确定哪个更适合您的需求。

于 2012-06-19T08:14:39.890 回答
4

threadingLock如果您需要保护整个临界区,则提供对象,或者Queue模块提供线程安全的队列。

于 2012-06-19T07:57:18.960 回答
1

标准库Queue怎么样?

于 2012-06-19T07:51:37.737 回答