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

时间:2014-04-18 15:20:42

标签: 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()]
        # ...

1 个答案:

答案 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()映射对象而不是,因为这可以保证为您提供线程本地命名空间。它只支持属性访问。