当使用当前线程的线程ID进行读取或写入时,Python字典线程是否安全?像
import thread
import threading
class Thread(threading.Thread):
def __init__(self, data):
super(Thread, self).__init__()
self.data = data
def run(self):
data = self.data[thread.get_ident()]
# ...
答案 0 :(得分:5)
如果 data
是标准的Python字典,__getitem__
调用完全用C实现,就像__hash__
方法对返回的整数值一样thread.get_ident()
。此时data.__getitem__(<thread identifier>)
调用是线程安全的。这同样适用于写data
; data.__setitem__()
调用完全在C中处理。
当这些钩子在Python代码中实现的时候,GIL可以在字节码之间释放,所有的赌注都关闭。
这一切都假设你正在使用CPython; Jython,IronPython,PyPy和其他python实现可能会决定何时切换线程。
您最好使用threading.local()
映射对象而不是,因为这可以保证为您提供线程本地命名空间。它只支持属性访问。