如何实现线程安全的struct / container类?

时间:2019-01-03 09:18:31

标签: python thread-safety python-multithreading

我正在用Python3编写一些相对简单的多线程代码,该代码从远程源获取数据,进行一些后期处理并存储数据以备后用。

我想使用一个简单的容器类(类似于c ++结构)来收集结果数据-主要是为了提高可读性,但同时考虑到将来的可扩展性。

我知道内置的python容器(列表,字典等)是线程安全的,并且类在某种程度上以字典形式实现(可以通过__dict__访问)。我未能找到任何信息的原因是这是否意味着像下面这样的简单类是线程安全的。

import threading

class Data:
    def __init__(self):
        self.name = ""
        self.age = -1
        self.order = []

def get_data(output, source_address):
    # Get data from remote source
    data = fetch(source_address)
    # Store data in output
    output.name = data.name
    output.age = data.age
    output.order = [data.item1, data.item2]

threads = []
result = []
for addr in address_list:
    result.append(Data())
    t = threading.Thread(target=get_data, args=(result[-1], addr))

for t in threads:
    t.join()

在上面的代码中,Data类实际上不需要是线程安全的-只有一个线程接触过该类的任何对象,并且这些对象都存储在一个列表中,而列表本身就是线程安全的。 >

如果我要添加另一组访问同一Data对象的线程,也许从第二个远程源添加数据,那么这种实现仍然足够。

如果上面的类定义不是线程安全的,那么在Python中定义线程安全容器类的惯用方式是什么?

0 个答案:

没有答案