itertools是线程安全的吗?

Jas*_*ker 16 python thread-safety python-itertools

例如,如果我使用创建迭代器chain,我可以在多个线程上调用它吗?请注意,依赖于GIL的线程安全性是可以接受的,但不是优选的.

(请注意,这与此问题略有不同,后者处理生成器,而不是用C编写的迭代器).

lio*_*ori 15

首先,关于itertools官方文档中没有任何内容表明它们是线程安全的.因此,似乎规范Python并不能保证任何相关内容.这可能与Jython或PyPy等实现有所不同,但这意味着您的代码可能无法移植.

其次,大多数itertools(除了简单的,除外count)将其他迭代器作为输入.您需要这些迭代器以线程安全的方式正确运行.

第三,当不同的线程同时使用时,一些迭代器可能没有意义.例如izip,在多个线程中工作可能会进入竞争条件,从多个源中获取元素,尤其是由等效的python代码定义的(当一个线程只能从一个输入迭代器获取值,然后从其中两个获取第二个线程时会发生什么? ).

另请注意,文档没有提到itertools用C实现的.我们知道(作为实现细节)CPython itertools实际上是用C语言编写的,但在其他实现中,它们可以很高兴地实现为生成器,你可以回到这个问题你引用了.

所以,不,你不能认为它们是线程安全的,除非你知道你的目标python平台的实现细节.