Как совместно использовать словарь между несколькими процессами в Python без блокировки

Я должен совместно использовать огромный словарь (приблизительно 1 ГБ в размере) между несколькими обрабатывают, однако так как все процессы будут всегда читать из него. Мне не нужна блокировка.

Там какой-либо путь состоит в том, чтобы совместно использовать словарь без блокировки?

Многопроцессорный модуль в Python обеспечивает класс Массива, который позволяет совместно использовать, не блокируя путем установки
lock=false
однако нет такой опции для Словаря, предоставленного менеджером в многопроцессорном модуле.

6
задан RandomVector 29 May 2010 в 21:15
поделиться

1 ответ

Ну, на самом деле dict на Manager вообще не имеет блокировок! Думаю, это справедливо и для других общих объектов, которые вы можете создать через менеджер. Как я это понял? Я попробовал:

from multiprocessing import Process, Manager

def f(d):
    for i in range(10000):
        d['blah'] += 1

if __name__ == '__main__':
    manager = Manager()

    d = manager.dict()
    d['blah'] = 0
    procs = [ Process(target=f, args=(d,)) for _ in range(10) ]
    for p in procs:
        p.start()
    for p in procs:
        p.join()

    print d

Если бы на d были блокировки, результат был бы 100000. Но вместо этого результат получился довольно случайным, и это просто хорошая иллюстрация того, почему блокировки нужны, когда вы изменяете материал ;-)

Так что просто идите вперед и используйте manager.dict().

5
ответ дан 17 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: