仅使用1个处理器的Python多处理 编辑:
谢谢你的回答。我理解这个问题。 我相信已经通过更改仅使用1个处理器的Python多处理 编辑:,python,windows,multiprocessing,Python,Windows,Multiprocessing,谢谢你的回答。我理解这个问题。 我相信已经通过更改imap\u无序行修复了它,但现在我有一个不同的问题 将多处理.Pool(processs=proc)作为p的: 对于p.imap_中的i无序(运行_任务,iterable,chunksize=chunksize): 印刷品(一) 我故意不包括所有其他的指纹,以便更好地理解为什么这不起作用。 它输出: File ".\test.py", line 23, in test_run for i in p.imap(run_task, ite
imap\u无序
行修复了它,但现在我有一个不同的问题
将多处理.Pool(processs=proc)作为p的:
对于p.imap_中的i无序(运行_任务,iterable,chunksize=chunksize):
印刷品(一)
我故意不包括所有其他的指纹,以便更好地理解为什么这不起作用。
它输出:
File ".\test.py", line 23, in test_run
for i in p.imap(run_task, iterable, chunksize=chunksize):
TypeError: 'int' object is not iterable
我用不同的函数尝试了同样的方法,而不是run\u task
:
def f(x):
return x*x
with multiprocessing.Pool(processes=proc) as p:
for i in p.imap_unordered(f, iterable, chunksize=chunksize):
print(i)
它输出正确!因此,有人会认为问题出在run_任务函数中。因此,我更改了run_任务函数:
def run_任务(iterable):
返回类型(iterable)
正如预期的那样,产出是:
<class 'int'>
<class 'int'>
<class 'int'>
...
输出:
Original size: 5000
Total process # 1
Chunksize # 10
Process # 1: has list length 5000
Original size: 5000
Total process # 5
Chunksize # 10
Process # 1: has list length 5000
Original size: 5000
Total process # 10
Chunksize # 10
Process # 1: has list length 5000
Original size: 5000
Total process # 1
Chunksize # 100
Process # 1: has list length 5000
Original size: 5000
Total process # 5
Chunksize # 100
Process # 1: has list length 5000
Original size: 5000
Total process # 10
Chunksize # 100
Process # 1: has list length 5000
指的是
imap\u unordered
等同于itertools
中的imap
,而imap
类似于map
简单地说,它们都对iterable的每个元素应用一个函数
召唤
for process, r_value in \
enumerate(p.imap_unordered(run_task, (iterable,),
chunksize=chunksize)):
# Add our process number and its return value into results so that we can compare performance here.
results[process + 1] = r_value
将run_task
应用于单个元素的列表。所以它只能做一个过程
枚举它-得到元组,其中第一个元素不是进程编号,而是原始列表中的元素编号。之所以只使用一个进程,是因为将iterable包装为元组。因此,您最终要做的是在元组的每个元素上运行函数
run\u task
,而不是在iterable的每个元素上运行您可能想要的函数。由于元组仅包含1个元素,因此它将只生成1个进程。谢谢!我在上面编辑了这个问题,因为我现在得到了一个不同的问题。当我像文档一样继续并传递chunksize(问题编辑部分中的代码)时,它仍然将整数而不是块的子列表传递到函数中。@Kramen,因为每个输入项都是独立处理的。您所说的更类似于名为reduce
的操作,而不是map
。请参阅关于chunksize
参数的答案