Python 使用分部函数将多个iterable参数传递给ProcessPoolExecutor.map 安装程序

Python 使用分部函数将多个iterable参数传递给ProcessPoolExecutor.map 安装程序,python,Python,我设置了一个函数来接收多个关键字参数: def process(image, folder, param1, param2, param3): do_things return 我有几个param1/2/3的组合,我想以完全置换的方式迭代它们(即1,4,7,然后1,4,8,直到3,6,9): 但是,图像和文件夹保持不变,因此我设置了一个类似这样的分部,并将其包装在ProcessPoolExecutor映射函数中: with futures.ProcessPoolExecutor

我设置了一个函数来接收多个关键字参数:

def process(image, folder, param1, param2, param3):
    do_things
    return
我有几个param1/2/3的组合,我想以完全置换的方式迭代它们(即1,4,7,然后1,4,8,直到3,6,9):

但是,
图像
文件夹
保持不变,因此我设置了一个类似这样的分部,并将其包装在ProcessPoolExecutor映射函数中:

with futures.ProcessPoolExecutor(max_workers=4) as executor:
    data = executor.map(
        partial(process,
            image=image,
            folder=folder,
        ),
        ...
    )
问题: 当我为函数设置了1个参数,并从
process()
中删除
param2
param3
时,以下单个iterable工作:

with futures.ProcessPoolExecutor(max_workers=4) as executor:
    data = executor.map(
        partial(process,
            image=image,
            folder=folder,
        ),
        [q for q in param1]
    )
但是如何传入多个iterable以供executor.map使用

我试过了 无论是否指定函数关键字名称,我都会得到一个
TypeError:process()参数'image'有多个值。

还尝试:

    with futures.ProcessPoolExecutor(max_workers=4) as executor:
    data = executor.map(
        partial(process,
            image=image,
            folder=folder,
        ),
        [i for i in product(param1, param2, param3)]
    )
上面给出的错误:
BrokenProcessPool:进程池中的进程在未来正在运行或挂起时突然终止。

预期结果 我希望executor.map遍历多个iterable,并将它们传递给正确的function关键字

可再现错误代码: 您永远不会确切地说您希望如何遍历param1/2/3,所以这只是一个猜测

您可以通过稍微更改
process()
函数的调用顺序并使用内置函数解压缩数据(如文档中所述),来完成我认为您需要的操作

请注意如何使用内置的
partial()
函数-在尝试时,尝试为位置函数传递关键字参数是不正确的

我还添加了使Python多处理代码(也)在Windows上工作所需的
if uuuuuu name_uuu=='\uuuuu main_uuuu':
guard

import concurrent.futures as futures
from functools import partial


def process(image, folder, params):
    param1, param2, param3 = params
    print(f'param1={param1}, param2={param2}, param3={param3}')


if __name__ == '__main__':

    image = 'image'
    folder = 'folder'

    param1 = [1, 2, 3]
    param2 = [4, 5, 6]
    param3 = [7, 8, 9]

    with futures.ProcessPoolExecutor(max_workers=4) as executor:
        data = executor.map(
            partial(process, image, folder),
            zip(*zip(param1, param2, param3))
        )

        for _ in data:
            ...
输出:

param1=1,param2=2,param3=3
参数1=4,参数2=5,参数3=6
参数1=7,参数2=8,参数3=9

将所有
param
作为列表或字典发送,然后函数将作为单个参数获取。顺便说一句:
[q代表param1中的q]
表示与
列表(param1)
或事件
param1
相同。顺便说一句:
[i代表产品中的i(param1,param2,param3)]
应给出与
列表(产品)相同的结果(param1,param2,param3))
但在某些情况下,它甚至应作为
产品(param1,param2,param3)
(不带
列表()
产品(param1,param2,param3)
创建具有3个值的元组,funciton可能会将其作为单个参数,而不是作为3个独立的参数。感谢您的回答!我试图对参数1/2/3中的所有元素进行完整的乘积置换,因此我使用product()[因此process()需要1,4,7,然后1,4,8等]。我会试试你的解决方案,让你知道它是如何运行的。注意:嗯,我运行时没有得到
BrokenProcessPool
。不管怎样,我会看看是否可以将解压“技巧”与
product()
结合使用。我使用的是Python 3.8.2PeptideWitch:你不需要使用
zip()
要制作产品,只需更改
zip(*zip(param1,param2,param3)
在我对
product(param1,param2,param3)
的回答中-再次假设我正确理解了您想要做的事情(并忽略
代理进程池的问题)。作为补充,请指定ProcessPoolExecutor在交互式python环境中无法正常工作,因此我将为此解决方案找到一个解决方案。PeptideWitch:很高兴听到您确定了
BrokenProcess Pool
的原因。在“交互式python环境”中无法工作只是指没有可由子进程导入的实际
\uuuuuu main\uuuu
.py脚本文件的环境(由于Python执行多处理的方式),因此有一个非常简单的“解决方法”-只需将其放在文件中并执行即可。
    with futures.ProcessPoolExecutor(max_workers=4) as executor:
    data = executor.map(
        partial(process,
            image=image,
            folder=folder,
        ),
        [i for i in product(param1, param2, param3)]
    )
from functools import partial
from concurrent import futures
from itertools import product

def new_fn(a, b, c):
    print(a, b, c)
    return (a, b, c)

a_static = 'Hi: '
b_it = ['b1', 'b2', 'b3']
c_it = ['c1', 'c2', 'c3']
p = [i for i in product(b_it, c_it)]

with futures.ProcessPoolExecutor(max_workers=4) as executor:
    data = executor.map(
        partial(new_fn, a=a_static), p
    )

data
import concurrent.futures as futures
from functools import partial


def process(image, folder, params):
    param1, param2, param3 = params
    print(f'param1={param1}, param2={param2}, param3={param3}')


if __name__ == '__main__':

    image = 'image'
    folder = 'folder'

    param1 = [1, 2, 3]
    param2 = [4, 5, 6]
    param3 = [7, 8, 9]

    with futures.ProcessPoolExecutor(max_workers=4) as executor:
        data = executor.map(
            partial(process, image, folder),
            zip(*zip(param1, param2, param3))
        )

        for _ in data:
            ...