У меня есть следующий код: (упрощенный)Как я могу поделиться глобальным словарем с ключом 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 только для секции цикла, и после цикла все процессы соединяются, прежде чем продолжить с остальной частью кода в одном потоке?
Благодаря Raskayu. эффективен ли метод менеджера для чрезвычайно больших словарей? Создает ли он копии DIC или нескольких процессов, используя тот же самый dic в памяти? В моем случае ключи, которые каждый процесс пишет, не перекрываются. – cybergeek654
@ cybergeek654 «Когда вы создаете многопроцессорный.Manager, генерируется отдельный серверный процесс, который отвечает за размещение всех объектов, созданных диспетчером». Как видите, он создается только один раз, поэтому в памяти будет один экземпляр. – Raskayu