一尘不染

Python-列表是线程安全的吗?

python

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


阅读 1271

收藏
2020-02-21

共1个答案

一尘不染

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

L[0] += 1

如果另一个线程做同样的事情,则不能保证实际上将L [0]增加1,因为+=这不是原子操作。(实际上,Python中很少有原子操作的操作,因为它们中的大多数操作都会导致调用任意Python代码。)你应该使用Queues,因为如果你仅使用不受保护的列表,则可能由于种族而获得或删除了错误的项目条件。

2020-02-21