使用池的python多重处理

使用池的python多重处理,python,multiprocessing,pool,Python,Multiprocessing,Pool,我有一个Python课程的作业 问题是: 您将编写一个程序,创建多个进程p=10。每个进程都将收到 整数值y,计算y乘以4y*4。y值的集合是一个列表 整数[0,1,2,3,4,5]。您必须使用进程池,因此需要映射这10个 进程获取y整数列表。请执行以下操作: Original - [0, 1, 2, 3, 4, 5] Poolworker - ForkPoolWorker-1 output: [0, 4, 8, 12, 16, 20] Poolworker - ForkPoolWorker-

我有一个Python课程的作业

问题是:

您将编写一个程序,创建多个进程p=10。每个进程都将收到 整数值y,计算y乘以4y*4。y值的集合是一个列表 整数[0,1,2,3,4,5]。您必须使用进程池,因此需要映射这10个 进程获取y整数列表。请执行以下操作:

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.打印出原始清单。 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-生成Poolworker-2输出:0 Poolworker-生成Poolworker-2输出:4 Poolworker-生成Poolworker-2输出:8 Poolworker-生成Poolworker-2输出:12 Poolworker-生成Poolworker-2输出:16 Poolworker-SpawnPoolWorker-2输出:20问题是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]
问题是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]

根据您的描述,您希望所有进程将数组乘以4

因此,使用并行进程,每个进程都有一个要相乘的数字数组

代码

输出


根据您的描述,您希望所有进程将数组乘以4

因此,使用并行进程,每个进程都有一个要相乘的数字数组

代码

输出


你可能会发现这很有用。我真的很难过,所以也许我说了很多对不起。而且我不是英语母语。很难用英语解释:/我觉得这个问题很好。@johnashu-thx-haha。我想我问这样的问题是不恰当的。我的工作压力太大了hw@sushisonjderekDon别担心。。我们都去过那里。。祝你学习顺利!你可能会发现这很有用。我真的很难过,所以也许我说了很多对不起。而且我不是英语母语。很难用英语解释:/我觉得这个问题很好。@johnashu-thx-haha。我想我问这样的问题是不恰当的。我的工作压力太大了hw@sushisonjderekDon别担心。。我们都去过那里。。祝你学习顺利!我真的很感激!但有几件事我不明白。[4*num代表num的数字]这是否意味着将整个数组元素相乘?idk非常了解python。而且,result=p.mapf,repeatNumber,这个池映射中的worker,它有“repeat”。这是否意味着重复10次?[4*num代表num代表num代表nums]被称为列表理解,因此是的,它将列表中的每个数字乘以4。repeat是标准库中的一个函数,它接受一个iterable,并在用户提供n的地方重复n次。在我们的例子中,我们希望它重复一个过程的次数,所以我们经常使用这个数字作为参数。我想我能很容易地理解你的答案。我真的很感激!但有几件事我不明白。[4*num代表num的数字]这是否意味着将整个数组元素相乘?idk非常了解python。而且,result=p.mapf,repeatNumber,这个池映射中的worker,它有“repeat”。这是否意味着重复10次?[4*num代表num代表num代表nums]被称为列表理解,因此是的,它将列表中的每个数字乘以4。repeat是标准库中的一个函数,它接受一个iterable,并在用户提供n的地方重复n次。在我们的例子中,我们希望它重复一个过程的次数,所以我们经常使用这个数字作为参数。我想我很容易理解你的答案。