Проблемы при распараллеливании метода Монте-Карло с многопроцессорной обработкой Python - PullRequest
0 голосов
/ 17 мая 2018

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

import func1, func2, func3, ... #some manipulations on the SAME numpy ndarray but each of then works independantly returns a independant result
import multiprocessing as mp
if __name__ == '__main__':
   with mp.Pool(processes=mp.cpu_count()) as pool:
   task1 = pool.Process(target=fun1, args(arg1, arg2, ...)
   task2 = pool.Process(target=fun2, args(arg1, arg2, ...)
   task3 = pool.Process(target=fun3, args(arg1, arg2, ...)
   ...
   task1.start()
   task2.start()
   task3.start()
   ...
   variable1 = task1.join() #In my case, I need to get the returns of these functions
   variable2 = task2.join()
   variable3 = task3.join()
   ...

Как и большинство учебников.Но я получил

RuntimeError: Была предпринята попытка запустить новый процесс до того, как текущий процесс завершит фазу начальной загрузки.

Я действительно новичок вэто поле и борется в течение нескольких дней, прежде чем я оставлю этот вопрос здесь.Может ли кто-нибудь дать мне несколько советов?

1 Ответ

0 голосов
/ 29 мая 2018

Я выясняю эту проблему RunTimeError, когда запускаю ту же программу на MacOS. На самом деле, эта ошибка RuntimeError связана со способом , как Windows компилирует файл .py.

Чтобы исправить это, самый простой способ - передать тело программы в функцию main() (хотя в моем случае это сложно), а затем добавить freeze_support() в модуль multipleprocessing. Так что в итоге это будет выглядеть так: import func1, func2, func3, ... # некоторые манипуляции на одном и том же массиве ndarray, но каждая из них работает независимо, возвращает независимый результат

import multiprocessing as mp
from multiprocessing import freeze_support()
def main():
   with mp.Pool(processes=mp.cpu_count()) as pool:
      task1 = pool.Process(target=fun1, args(arg1, arg2, ...)
      task2 = pool.Process(target=fun2, args(arg1, arg2, ...)
      task3 = pool.Process(target=fun3, args(arg1, arg2, ...)
      ...
      task1.start()
      task2.start()
      task3.start()
      ...
      variable1 = task1.join() #In my case, I need to get the returns of these functions
      variable2 = task2.join()
      variable3 = task3.join()
      ...
if __name__ == '__main__':
   freeze_support()
   main()
...