python - itertools 是线程安全的吗?

标签 python thread-safety python-itertools

例如,如果我使用 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/

相关文章:

python - 有没有办法生成项目列表的所有唯一排列

python - z3 中的空模型

java - 累加器是线程安全的吗?

python - 我怎样才能将列表另外压缩到已经压缩的列表中?

swift - 一次对数据库执行一项多项任务

c# - 无锁线程安全队列——需要建议

python - 如何在一个循环中比较两个列表的值是否相等?

python - 如何获取 pandas.Series 或 pandas.DataFrame 中第 i 个项目的索引?

python - 如何在@pytest.mark.parametrize 上使用类变量

python - Python 中的 MySQL 连接器不允许 LOAD DATA INFILE 语法