当键是线程ID时,Python字典是线程安全的吗?

当键是线程ID时,Python字典是线程安全的吗?,python,multithreading,dictionary,critical-section,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.ge

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

如果
数据
是一个标准的Python字典,那么
\uu getitem\uuuuuuu
调用完全用C实现,对
线程返回的整数值的
\uuuu hash\uuu
方法也是如此。此时,
数据.\uuuu getitem\uuuu()
调用是线程安全的。这同样适用于写入
数据
data.\uuuu setitem\uuuu()
调用完全用C语言处理

当这些钩子中的任何一个在Python代码中实现时,GIL就可以在字节码之间释放,所有的赌注都结束了

这一切都假设您正在使用CPython;Jython、IronPython、PyPy和其他python实现可能会在何时切换线程上做出不同的决定


您最好改用映射对象,因为它保证为您提供一个线程本地名称空间。不过它只支持属性访问。

我想不支持。在扩展底层数据结构的过程中,键仍然会发生冲突,数据仍然会在内存中移动,无论线程是否小心不使用相同的键。实际上,看看您的代码,如果它确实代表了您的问题,我根本不清楚为什么要这样做。您是否正在尝试使用
数据
作为主设备和辅助设备之间的一种信号管道?我不明白为什么您不能将
数据的单个元素
dict传递给线程
\uuuu init\uuuu
,并将其用作
self.data
,而不是用线程的id索引到其中。您首先在哪里填充该id处的数据?