многопроцессорный вопрос с использованием пула и карты - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу получить выходные данные, используя функцию пула и карты в python следующим образом:

** Вывод в случайном порядке:

Вывод PoolWorker-10: [0, 4 , 8, 12, 16, 20]

Выход PoolWorker-11: [0, 4, 8, 12, 16, 20]

Выход PoolWorker-12: [0, 4, 8 , 12, 16, 20]

Выход PoolWorker-1: [0, 4, 8, 12, 16, 20]

..... **

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

from multiprocessing import Pool, current_process

def multiprocessing_func():
   input_list = [0, 1, 2, 3, 4, 5]
   print("input list: {}".format(input_list))
   print("Output in random order: ")

   pool = Pool(10, current_process_func)
   result = pool.map(calculate, input_list)
   print(result)
   pool.close()
   pool.join()

def calculate(y_list):
   return y_list * 4

def current_process_func():
   print("{} output: ".format(current_process().name))

if __name__ == '__main__':
   multiprocessing_func()

Когда я запускаю его, я получаю следующий результат:

Вывод в случайном порядке:

Вывод PoolWorker-1:

Выход PoolWorker-2:

Выход PoolWorker-3:

Выход PoolWorker-4:

Выход PoolWorker-5:

PoolWorker-7 выход:

выход PoolWorker-6:

[0, 4, 8, 12, 16, 20]

выход PoolWorker-8:

PoolWorker Выход -9:

Выход PoolWorker-10:


Что я должен изменить, чтобы получить желаемый результат выше?

1 Ответ

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

Изменен ваш фрагмент, как показано ниже. В общем, учитывайте следующее:

  • pool.map(func, data) Под данными следует понимать данные, которые должны быть распределены по пулу ЦП (и также исключают этот процесс). Далее, по крайней мере, столько элементов, сколько должно быть процессов, чтобы наилучшим образом использовать пул. (Я просто поместил там 10 одинаковых списков).

  • пропустил аргумент инициализации в конструкции Pool(), чтобы просто вывести нужные данные после завершения вычисления.

    from multiprocessing import Pool, current_process
    
    def multiprocessing_func():
        input_list = [0, 1, 2, 3, 4, 5]
        print("input list: {}".format(input_list))
        print("Output in random order: ")
    
        pool = Pool(10) 
        result = pool.map(calculate, [input_list]*10)
    
        print()
        print("collected:" , result)
        pool.close()
        pool.join()
    
    def calculate(y_list):
        out = [x*4 for x in y_list] 
        current_process_func(out)
        return out   
    
    def current_process_func(data):
        print("{} output: {}".format(current_process().name, data))
    
    if __name__ == '__main__':
        multiprocessing_func()
    

приводит к:

input list: [0, 1, 2, 3, 4, 5]
Output in random order: 
ForkPoolWorker-52 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-55 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-57 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-51 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-53 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-54 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-56 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-58 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-60 output: [0, 4, 8, 12, 16, 20]
ForkPoolWorker-59 output: [0, 4, 8, 12, 16, 20]

collected: [[0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4,    8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20], [0, 4, 8, 12, 16, 20]]

это то, что вы ожидали?

...