在Python中,set.pop()线程安全吗?

时间:2012-03-28 15:40:09

标签: python

我知道python中的内置集类型通常不是线程安全的,但是this回答声称从两个竞争线程调用pop()是安全的。当然,您可能会遇到异常,但您的数据没有损坏。我似乎无法找到证明这一说法的文件。这是真的吗?请提供文档!

2 个答案:

答案 0 :(得分:8)

如果查看set.pop method in the CPython source,您会发现它不会释放GIL。

这意味着CPython流程中一次只会发生一个set.pop

set.pop checks if the set is empty以来,您尝试从空集中弹出,不会导致IndexError以外的任何内容。

所以不,你不能通过使用CPython从多个线程中的一个集合弹出来破坏数据。

答案 1 :(得分:0)

我认为Set“pop”操作由于是原子的而是线程安全的,因为两个线程将无法弹出相同的值。

如果另一个线程正在迭代该集合,我不会依赖它的行为。

我也找不到任何具体的文件,只是指向这个方向的一些主题。 Python官方文档确实会受益于此类信息。