Могу ли я получить возвращаемое значение из multiprocessing.Process?
Я реализовал несколько простых parallelism в коде Монте-Карло, используя модуль многопроцессорности Python. У меня есть код, который выглядит так:
montecarlos = [MonteCarlo(f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [mc.results for mc in montecarlos]
Однако, когда я смотрю на список результатов, похоже, что иранские монтеры уже не начали. Я знаю, что они есть, потому что у меня могут быть процессы распечатывать информацию во время шагов monte carlo. Поэтому я делаю что-то немое. Я думал, что job.join() сохранит список результатов, который будет создан, пока все не запустится, и, следовательно, поле mc.results будет обновлено.
Я понимаю, что я не рассказал вам подробностей моей повседневной рутины и надеюсь, что это не имеет значения, и что ошибка, которую я делаю, заключается в моей интерпретации того, что делает многопроцессорность. Заранее благодарим за любую помощь, которую вы можете предложить.
Ответы
Ответ 1
Объекты MonteCarlo
были протравлены и отправлены дочерним процессам, которые будут запущены - атрибут .results
в этом процессе не заполняется, поскольку локальный mc
никогда не запускался.
Если вы создаете multiprocessing.Queue
, вы можете передать это в каждое задание MonteCarlo
, и когда он закончит, он должен поместить там результат. Тогда верхний уровень может ждать значений из очереди. (Под капотом это будет мариновать и распечатывать объект результата.)
result_queue = multiprocessing.Queue()
montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [result_queue.get() for mc in montecarlos]