Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅使用1个处理器的Python多处理 编辑:_Python_Windows_Multiprocessing - Fatal编程技术网

仅使用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
参数的答案