Как реализовать потокобезопасный класс struct / container? - PullRequest
0 голосов
/ 03 января 2019

Я пишу относительно простой многопоточный код на Python3, который извлекает данные из удаленного источника, выполняет некоторую постобработку и сохраняет данные для последующего использования.

Я хотел бы использовать простой контейнерный класс (похожий на структуру c ++) для сбора результирующих данных - в первую очередь для удобства чтения, но также с учетом возможности расширения в будущем.

Мне известно, что встроенные в Python контейнеры (list, dict и т. Д.) Являются потокобезопасными, и что классы реализованы на некотором уровне как dict (к которому можно получить доступ с помощью __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 на самом деле не должен быть потокобезопасным - только один поток когда-либо касается любого объекта этого класса, и все эти объекты хранятся в списке, который сам по себе является потокобезопасным.

Если бы я добавил еще один набор потоков, которые обращались к тем же объектам данных, возможно, добавив данные из второго удаленного источника, эта реализация была бы достаточной.

Если приведенное выше определение класса не является потокобезопасным, каков будет идиоматический способ определения класса потокаобезопасного контейнера в Python?

...