小编典典

列表是线程安全的吗?

all

我注意到通常建议使用具有多个线程的队列,而不是列表和.pop(). 这是因为列表不是线程安全的,还是出于其他原因?


阅读 63

收藏
2022-07-06

共1个答案

小编典典

列表本身是线程安全的。在 CPython 中,GIL 防止对它们的并发访问,并且其他实现注意使用细粒度锁或同步数据类型来实现它们的列表。但是,虽然列表
本身 不会因尝试并发访问而损坏,但列表的 数据 不受保护。例如:

L[0] += 1

如果另一个线程执行相同的操作,则不能保证实际将 L[0] 增加一个,因为+=它不是原子操作。(Python
中非常非常少的操作实际上是原子的,因为它们中的大多数都可以导致任意 Python
代码被调用。)您应该使用队列,因为如果您只使用不受保护的列表,您可能会因为竞争而获取或删除 错误的项目 条件。

2022-07-06