我注意到通常建议使用具有多个线程的队列,而不是列表和.pop(). 这是因为列表不是线程安全的,还是出于其他原因?
.pop()
列表本身是线程安全的。在 CPython 中,GIL 防止对它们的并发访问,并且其他实现注意使用细粒度锁或同步数据类型来实现它们的列表。但是,虽然列表 本身 不会因尝试并发访问而损坏,但列表的 数据 不受保护。例如:
L[0] += 1
如果另一个线程执行相同的操作,则不能保证实际将 L[0] 增加一个,因为+=它不是原子操作。(Python 中非常非常少的操作实际上是原子的,因为它们中的大多数都可以导致任意 Python 代码被调用。)您应该使用队列,因为如果您只使用不受保护的列表,您可能会因为竞争而获取或删除 错误的项目 条件。
+=