如何使用多处理并行运行函数,同时在python中迭代函数参数?
我有一个任意函数,它的参数是一个文件,比如说如何使用多处理并行运行函数,同时在python中迭代函数参数?,python,file,parallel-processing,directory,arguments,Python,File,Parallel Processing,Directory,Arguments,我有一个任意函数,它的参数是一个文件,比如说func(file(I))。我有不同的目录,比如说folder\u id1,folder\u id2,…,folder\u idn。在每个目录中都有一些文件(i),例如,在文件夹\u id2中有文件文件(1)、文件(2)、文件(3)-三个文件-每个目录都有不同数量的文件 我想使用多处理为特定文件夹内的每个文件(I)并行运行函数func(文件(I))。所以会是这样的: def runInParallel(funcs): proc = [] for
func(file(I))
。我有不同的目录,比如说folder\u id1,folder\u id2,…,folder\u idn
。在每个目录中都有一些文件(i)
,例如,在文件夹\u id2中有文件文件(1)、文件(2)、文件(3)
-三个文件-每个目录都有不同数量的文件
我想使用多处理
为特定文件夹内的每个文件(I)
并行运行函数func(文件(I))
。所以会是这样的:
def runInParallel(funcs):
proc = []
for func in funcs:
p = Process(target=func)
p.start()
proc.append(p)
for p in proc:
p.join()
def foo(folder_id(i)):
runInParallel(func(file(1)), func(file(2)), ..., func(file(n)))
但是,我不知道如何将所有函数func(file(I))
与函数runInParallel()
的参数同时设置。一个选项是迭代文件夹文件夹\u id(i)
中的文件file(n)
,但它不会并行运行
有什么想法吗<代码>局部变量()
谢谢
编辑:
一种方法是获取给定
文件夹\u id(i)
中存在的所有文件的完整路径。然后,您可以将此文件路径
和func
传递到并行运行
,然后将func
并行应用到每个文件。
您还必须修改func
函数,以便它可以将file\u path
作为参数。
以下是便于执行此任务的代码
import os
from multiprocessing import Process
def runInParallel(file_paths, func):
proc = []
for path in file_paths:
p = Process(target=func, args=(path,))
p.start()
proc.append(p)
for p in proc:
p.join()
def foo(folder_id):
paths = [os.path.join(folder_id, filename) for filename in os.listdir(folder_id)]
file_paths = [path for path in paths if os.path.isfile(path)]
runInParallel(file_paths, func)
def runInParallel(file_paths, func):
with Pool() as pool:
results = pool.map(func, file_paths)
或者,您可以使用multiprocessing.Pool
来简化此任务,而不是使用Process
import os
from multiprocessing import Process
def runInParallel(file_paths, func):
proc = []
for path in file_paths:
p = Process(target=func, args=(path,))
p.start()
proc.append(p)
for p in proc:
p.join()
def foo(folder_id):
paths = [os.path.join(folder_id, filename) for filename in os.listdir(folder_id)]
file_paths = [path for path in paths if os.path.isfile(path)]
runInParallel(file_paths, func)
def runInParallel(file_paths, func):
with Pool() as pool:
results = pool.map(func, file_paths)
更新(根据您的评论): 如果
modelo
是文件对象,则将desagagadorlstm
方法更新为
def desagregadorLSTM(path, df, medicoes=96):
with open(path, "r") as modelo:
model = load_model(modelo)
model.summary()
df = df
X, y = f.separar_interface(df, n_steps=40)
X = X.reshape(X.shape[0], 2, 20, X.shape[2])
y = y.reshape(y.shape[0], 40, 1)
test_predictions = model.predict(X).flatten()
y = y.flatten()
电话,
runInParallel(file_paths, tms.desagregadorLSTM)
Alo更新
p = Process(target=func, args=(path, df), kwargs={"medicoes": 96 })
我的函数
foo()
有一个参数,即文件。它类似于foo(modelo=file,df=df)。我之前设置的第二个参数,但它仍然要求第一个参数<代码>类型错误:DesagregadorStm()缺少1个必需的位置参数:“modelo”定义DesagregadorStm(modelo,df,medicoes=96):model=load_model(modelo)model.summary()df=df X,y=f.separar_接口(df,n_steps=40)X=X.reshape(X.shape[0],2,20,X.shape[2])=y=y.reshape[0],40,1)test_predicts=model.predict(X).flatte()y=y.flatte()
您到底是如何调用此函数的?我收到了此消息:NameError:未定义名称“df”