Python内置的容器是否是线程安全的?

我想知道如果Python内置容器(列表,向量,集…)是线程安全的? 还是我需要为我的共享variables实现locking/解锁环境?

您需要为所有将在Python中修改的共享variables实现自己的locking。 你不必担心从不会被修改的variables读取(即并发读取是可以的),所以不可变的types( frozensettuplestr可能是安全的,但它不会伤害。 对于你要改变的东西 – listsetdict和大多数其他对象,你应该有自己的locking机制(在大多数情况下就地操作是可以的,线程可以导致超级讨厌的错误 -你也可以实现locking,这很容易)。

顺便说一下,我不知道你是否知道这一点,但在Python中locking非常容易 – 创build一个threading.lock对象,然后你可以像这样获取/释放它:

 import threading list1Lock = threading.Lock() with list1Lock: # change or read from the list here # continue doing other stuff (the lock is released when you leave the with block) 

在Python 2.5中, from __future__ import with_statement ; Python 2.4和之前没有这个,所以你会想在try:...finally:放置acquire()/ release()调用try:...finally: blocks:

 import threading list1Lock = threading.Lock() try: list1Lock.acquire() # change or read from the list here finally: list1Lock.release() # continue doing other stuff (the lock is released when you leave the with block) 

有关Python中线程同步的一些非常好的信息 。

是的,但是你当然还需要小心

例如:

如果两个线程正在竞争从列表中只有一个项目pop() ,一个线程将成功获取该项目,另一个将得到一个IndexError

这样的代码不是线程安全的

 if L: item=L.pop() # L might be empty by the time this line gets executed 

你应该这样写

 try: item=L.pop() except IndexError: # No items left 

只要不禁用线程的C代码中的GIL,它们就是线程安全的。