Как запустить код после завершения многопроцессорной части в python - PullRequest
0 голосов
/ 06 апреля 2020

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

def data_generation(param1, param2, param3):
    main function
    np.save(....)

for i in np.arrange(10):
   if __name__ == '__main__':
   ratio = np.arange(0.3, 1.4, 0.1)
   pool = Pool(os.cpu_count())
   param1 = 1
   param2 = 2
   func = partial(data_generation, param1, param2)
   _ = pool.map(func, param3=ratio)
   pool.close()
   pool.join()
   ### then I would like to read the generated data and do analysis
   result = np.load(..)

Моя идея такова, что я хотел бы выполнить одну работу 10 раз. Каждый раз я генерирую данные, выполняю анализ, сохраняю результат и делаю это снова. Для части генерации данных один параметр должен быть изменен с 0,3 до 1,4. Вот где я хочу использовать многопроцессорность.

Проблема в том, что каждый раз, когда я запускаю код, похоже, что python перепрыгивал часть генерации данных и переходил непосредственно к части анализа.

Так что же означает логика c для этой задачи? Я надеюсь, что часть анализа данных очищена после части генерации данных.

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете использовать pool.starmap, который ожидает кортеж кортежей, которые являются аргументами вашей функции. Здесь, чтобы показать шаги, я заранее сгенерировал кортежи и сохранил их в func_arg_tuple.

Также нет необходимости в промежуточном шаге сохранения результатов в функции data_generation. Просто верните значение, которое вы хотите обработать, и оно будет в results, когда работа пула будет завершена.

import multiprocessing

def data_generation(param1, param2, param3):
    # sample processing function - add your own
    return np.random.normal(param3, param1, param2)

param1 = 1
param2 = 2

with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
    func_arg_tuple = tuple((param1, param2, ratio) for ratio in np.arange(0.3, 1.4, 0.1))
    results = pool.starmap(data_generation, func_arg_tuple)

>>>results
[array([-0.89459092,  2.03727378]),
 array([-0.79459092,  2.13727378]),
 array([-0.69459092,  2.23727378]),
 array([0.57145244, 0.75501116]),
 array([ 2.40776746, -0.17882601]),
 array([0.77145244, 0.95501116]),
 array([-0.88291467,  1.3072801 ]),
 array([0.97145244, 1.15501116]),
 array([0.0123457 , 2.25667152]),
 array([2.90776746, 0.32117399]),
 array([3.00776746, 0.42117399])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...