Подтвердить что ты не робот

Могу ли я получить возвращаемое значение из 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 будет обновлено.

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

4b9b3361

Ответ 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]