2

У меня есть следующий код: (упрощенный)Как я могу поделиться глобальным словарем с ключом tuple между различными ядрами Muliprocessing Python?

def main_func(): 
    anotherDic = {} 
    dic = {(1,2):44, (4,6):33, (1,1):4, (2,3):4} 
    ks = dic.keys() 
    for i in ks: 
     func_A(anotherDic, i[0], i[1], dic[i], 5) 

Основной словарь (DIC) является довольно большим, и для петель идет на 500 миллионов итераций. Я хочу использовать многопроцессорную обработку для параллелизации цикла на многоядерной машине. Я прочитал несколько вопросов SO и многопроцессорную библиотеку lib, и это очень полезно video и до сих пор не может понять. Я хочу, чтобы программа вилка в несколько потоков, когда она достигает этого цикла, запускается параллельно, а затем после того, как все процессы завершены, он должен продолжить программу по отдельному процессу из строки после цикла. func_A получил значение словаря и ключ от dic, вычисляет некоторые простые операции и обновляет данные anotherDic. Это независимый процесс, поскольку все те же i [0] ключи обрабатываются одним и тем же процессом. Таким образом, я не могу использовать функцию отображения пула, которая автоматически делит данные между ядрами. Я собираюсь сортировать ключи по первому элементу ключевого кортежа, а затем разделить их вручную между потоками.

Как я могу передавать/распространять очень большой словарь (dic) между процессами? Различные процессы будут считываться и записываться на разные ключи (т.е. ключи, с которыми связан каждый процесс, отличаются от остальных процессов) Если я не могу найти ответ на этот вопрос, я просто использую меньший временный dic для каждого процесса, и в конце концов просто присоединяйтесь к дикам.

Тогда вопрос в том, как я могу заставить процесс вилки и идти muliprocessor только для секции цикла, и после цикла все процессы соединяются, прежде чем продолжить с остальной частью кода в одном потоке?

ответ

2

Общий ответ включает использование объекта Manager. Адаптировано из документации:

from multiprocessing import Process, Manager 

def f(d): 
    d[1] += '1' 
    d['2'] += 2 

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

    d = manager.dict() 
    d[1] = '1' 
    d['2'] = 2 

    p1 = Process(target=f, args=(d,)) 
    p2 = Process(target=f, args=(d,)) 
    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

    print d 

Выход:

$ python mul.py 
{1: '111', '2': 6} 

Оригинальный ответ: Python multiprocessing: How do I share a dict among multiple processes?

+0

Благодаря Raskayu. эффективен ли метод менеджера для чрезвычайно больших словарей? Создает ли он копии DIC или нескольких процессов, используя тот же самый dic в памяти? В моем случае ключи, которые каждый процесс пишет, не перекрываются. – cybergeek654

+1

@ cybergeek654 «Когда вы создаете многопроцессорный.Manager, генерируется отдельный серверный процесс, который отвечает за размещение всех объектов, созданных диспетчером». Как видите, он создается только один раз, поэтому в памяти будет один экземпляр. – Raskayu