我知道python中的内置集类型通常不是线程安全的,但是this回答声称从两个竞争线程调用pop()是安全的。当然,您可能会遇到异常,但您的数据没有损坏。我似乎无法找到证明这一说法的文件。这是真的吗?请提供文档!
答案 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官方文档确实会受益于此类信息。