Многопроцессорность Python для параллельных процессов

Мне жаль, если это слишком просто для некоторых людей, но я все еще не получаю трюк с многопроцессорностью python. я прочел
http://docs.python.org/dev/library/multiprocessing
http://pymotw.com/2/multiprocessing/basics.html и многие другие уроки и примеры, которые google дает мне … многие из них тоже здесь.

Ну, моя ситуация в том, что мне приходится вычислять много матриц numpy, и мне нужно сохранить их в одной матрице numpy после этого. Предположим, я хочу использовать 20 ядер (или я могу использовать 20 ядер), но мне не удалось успешно использовать ресурс пула, так как он поддерживает процессы до тех пор, пока пул «не умрет». Поэтому я подумал о том, чтобы сделать что-то вроде этого:

from multiprocessing import Process, Queue import numpy as np def f(q,i): q.put( np.zeros( (4,4) ) ) if __name__ == '__main__': q = Queue() for i in range(30): p = Process(target=f, args=(q,)) p.start() p.join() result = q.get() while q.empty() == False: result += q.get() print result 

но тогда похоже, что процессы не работают параллельно, но они запускаются последовательно (пожалуйста, исправьте меня, если я ошибаюсь), и я не знаю, умирают ли они после того, как они выполняют свои вычисления (так что для более чем 20 процессов те что их часть оставила ядро ​​свободным для другого процесса). Кроме того, для очень большого количества (скажем, 100 000), хранение всех этих матриц (что может быть очень большим) в очереди будет использовать много памяти, что делает код бесполезным, поскольку идея состоит в том, чтобы каждый результат на каждой итерации в конечном результате, например, используя методы блокировки (и его получения () и release ()), но если этот код не предназначен для параллельной обработки, блокировка тоже бесполезна …

Надеюсь, кто-то может мне помочь.

Заранее спасибо!

  • Разница между последовательными элементами в списке
  • что не так с потоками c ++ при использовании boost.python?
  • Использование «argparse» в отличие от sys.argv
  • Горизонтальные ящики в matplotlib / Pandas
  • Почему отладка в eclipse / pydev настолько медленная для моей программы python?
  • Почему Pydev дает синтаксическую ошибку для встроенных ключевых слов?
  • Tensorflow: восстановление графика и модели, а затем выполнение оценки на одном изображении
  • Отображение OpenCV-видео в tkinter с использованием многопроцессорности
  • One Solution collect form web for “Многопроцессорность Python для параллельных процессов”

    Вы правы, они выполняются последовательно в вашем примере.

    p.join() заставляет текущий поток блокироваться, пока он не завершит выполнение. Вы либо захотите присоединиться к своим процессам отдельно вне цикла for (например, путем их хранения в списке и затем повторить его) или использовать что-то вроде numpy.Pool и apply_async с обратным вызовом. Это также позволит вам добавить его к вашим результатам напрямую, а не поддерживать объекты вокруг.

    Например:

     def f(i): return i*np.identity(4) if __name__ == '__main__': p=Pool(5) result = np.zeros((4,4)) def adder(value): global result result += value for i in range(30): p.apply_async(f, args=(i,), callback=adder) p.close() p.join() print result 

    Закрытие, а затем объединение пула в конце гарантирует, что процессы пула завершены и конечный объект будет вычисляться. Вы также можете исследовать использование Pool.imap в качестве решения вашей проблемы. Это конкретное решение будет выглядеть примерно так:

     if __name__ == '__main__': p=Pool(5) result = np.zeros((4,4)) im = p.imap_unordered(f, range(30), chunksize=5) for x in im: result += x print result 

    Это чище для вашей конкретной ситуации, но может и не быть тем, что вы в конечном итоге пытаетесь сделать.

    Что касается сохранения всех ваших разнообразных результатов, если я понимаю ваш вопрос, вы можете просто добавить его в результат в методе обратного вызова (как указано выше) или по отдельности с использованием imap / imap_unordered (который по-прежнему сохраняет результаты , но вы очистите его по мере его сборки). Затем его не нужно хранить дольше, чем требуется, чтобы добавить результат.

    Python - лучший язык программирования в мире.