使用池的python多重处理
我有一个Python课程的作业 问题是: 您将编写一个程序,创建多个进程p=10。每个进程都将收到 整数值y,计算y乘以4y*4。y值的集合是一个列表 整数[0,1,2,3,4,5]。您必须使用进程池,因此需要映射这10个 进程获取y整数列表。请执行以下操作:使用池的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-
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次。在我们的例子中,我们希望它重复一个过程的次数,所以我们经常使用这个数字作为参数。我想我很容易理解你的答案。