python многократная обработка с использованием пула - PullRequest
1 голос
/ 21 апреля 2020

У меня есть задание для моего курса в Python.

Вопрос в следующем:

Вы напишите программу, создающую несколько процессов (p = 10). Каждый процесс получит целочисленное значение (y) и вычислит значение y, умноженное на 4 (y * 4). Набор значений y представляет собой список целых чисел [0, 1, 2, 3, 4, 5]. Вы должны использовать пул процессов, поэтому вам нужно отобразить эти 10 процессов, чтобы получить список из y целых чисел. Сделайте следующее:

Ваша программа должна распечатать следующие три. (1) Распечатайте оригинальный список. (2) Вывести имя каждого запущенного процесса и его выходные данные y * 4 в случайном порядке выполнения

Вывод (1): Список ввода: [0, 1, 2, 3, 4, 5]

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

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

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

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

Моя первая попытка была:

import time
from multiprocessing import Pool
from multiprocessing import Process, current_process
def f(number):
    result=4*number
    Process_name=current_process().name
    print(f"Poolworker -{Process_name} output: {result} ")

    return result

if __name__=='__main__':
    p= Pool(processes=10)
    numbers=[0,1,2,3,4,5]
    result=p.map(f,numbers)

Вывод был:

Poolworker -SpawnPoolWorker-2 output: 0 
Poolworker -SpawnPoolWorker-2 output: 4 
Poolworker -SpawnPoolWorker-2 output: 8 
Poolworker -SpawnPoolWorker-2 output: 12 
Poolworker -SpawnPoolWorker-2 output: 16 
Poolworker -SpawnPoolWorker-2 output: 20 

Моя вторая попытка:

import time
from multiprocessing import Pool
from multiprocessing import Process, current_process
def f(*number):
	numbers=list(number)
	i=0
	for x in numbers:
		numbers[i]=4*numbers[i]
		i+=1
	Process_name=current_process().name
	print(f"Poolworker -{Process_name}output: {numbers} ")

	return numbers

if __name__ == '__main__':
		array=[0,1,2,3,4,5]
		p=Pool(processes=10)
	
		result=p.map(f,array)
		
               

У меня все еще неправильный вывод с изменениями.

Как получить желаемый результат?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

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

from itertools import repeat
from multiprocessing import Pool
from multiprocessing import Process, current_process

def f(numbers):
    result= [4 * num for num in numbers]
    name=current_process().name
    print(f"Poolworker - {name} output: {result} ")
    return result

if __name__=='__main__':
    WORKERS = 10
    p = Pool(processes=WORKERS)
    numbers = [0, 1, 2, 3, 4, 5]
    print(f"Original - {numbers}")
    result = p.map(f, repeat(numbers, WORKERS))

Возвращает следующее:

Original - [0, 1, 2, 3, 4, 5]
Poolworker - ForkPoolWorker-1 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-2 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-3 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-4 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-5 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-6 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-7 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-8 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-9 output: [0, 4, 8, 12, 16, 20] 
Poolworker - ForkPoolWorker-10 output: [0, 4, 8, 12, 16, 20]
1 голос
/ 21 апреля 2020

Из вашего описания вы хотите, чтобы все процессы умножали массив на 4.

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

Ссылка

Код

from multiprocessing import Process

import multiprocessing as mp

def f(numbers, output):
    " Places process name and numbers multiplied by 4 into output queue "
    output.put((mp.current_process().name, [4*n for n in numbers]))

# Define an output queue
output = mp.Queue()

# Setup a list of processes that we want to run
numbers = [1, 2, 3, 4, 5]
processes = [mp.Process(target=f, args=([1, 2, 3, 4, 5], output)) for x in range(10)]

# Run processes
for p in processes:
    p.start()

# Exit the completed processes
for p in processes:
    p.join()

# Get process results from the output queue
results = [output.get() for p in processes]


for id, values in results:
  print(f'PoolWorker {id} output: {values}')

Выход

PoolWorker Process-1 output: [4, 8, 12, 16, 20]
PoolWorker Process-3 output: [4, 8, 12, 16, 20]
PoolWorker Process-9 output: [4, 8, 12, 16, 20]
PoolWorker Process-6 output: [4, 8, 12, 16, 20]
PoolWorker Process-7 output: [4, 8, 12, 16, 20]
PoolWorker Process-5 output: [4, 8, 12, 16, 20]
PoolWorker Process-4 output: [4, 8, 12, 16, 20]
PoolWorker Process-8 output: [4, 8, 12, 16, 20]
PoolWorker Process-2 output: [4, 8, 12, 16, 20]
PoolWorker Process-10 output: [4, 8, 12, 16, 20]
...