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:
...