例如,如果我使用 chain
创建一个迭代器,我可以在多线程上调用它吗?请注意,依赖于 GIL 的线程安全是可以接受的,但不是可取的。
(请注意,这与 this question 有点不同,它处理生成器,而不是用 C 编写的迭代器)。
最佳答案
首先,official documentation on itertools 中没有任何内容说它们是线程安全的。因此,根据规范,Python 似乎不能对此做出任何保证。这在 Jython 或 PyPy 等实现中可能有所不同,但这意味着您的代码可能无法移植。
其次,大多数itertools
(简单的除外,如count
)将其他迭代器作为其输入。您还需要这些迭代器以线程安全的方式正确运行。
第三,一些迭代器在不同线程同时使用时可能没有意义。例如,在多个线程中工作的 izip
可能会进入竞争条件,从多个来源获取元素,尤其是等效的 python 代码定义的元素(当一个线程设法从一个输入迭代器获取值时会发生什么,然后他们两个的第二个线程?)。
另请注意,文档中没有提到 itertools
是用 C 实现的。我们知道(作为实现细节)CPython 的 itertools
实际上是用 C 编写的,但是在其他实现中,它们可以愉快地实现为生成器,您可以返回到 question you cited .
所以,不,除非您知道目标 python 平台的实现细节,否则您不能假设它们是线程安全的。
关于python - itertools 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083348/