密钥是线程ID时,Python字典是否是线程安全的?

Nik*_*s R 2 python multithreading dictionary critical-section

使用当前线程的线程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()]
        # ...
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 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()映射对象,而不是,因为这是保证为您提供一个线程本地命名空间.它只支持属性访问.