多进程-如何将变量传递给并行执行的函数



我已经编写了一些代码来并行处理Jupyter笔记本中的一些数据。

它由一个函数组成,该函数将一些数据作为输入,对它们进行转换并将结果写入文件:

%%writefile my_functions.py
import pickle
def my_function(f):
d = f*10
with open(f"{v}.p", "wb") as f:
pickle.dump(d, f, pickle.HIGHEST_PROTOCOL)

函数主要调用:

from multiprocess import Pool
from my_functions import my_function
from tqdm import tqdm
values_list = [0, 1, 2, 3, 4, 5, 6]
max_pool = 5
factor=10
with Pool(max_pool) as p:
pool_outputs = list(
tqdm(
p.imap(my_function,
values_list),
total=len(values_list)
)
)    

如何修改代码以便将一些变量传递给my_function?例如,假设我想传递变量v:的值

%%writefile my_functions.py
import pickle
def my_function(f,v):
d = f*v
with open(f"{v}.p", "wb") as f:
pickle.dump(d, f, pickle.HIGHEST_PROTOCOL)

如何相应地修改对p.imap的调用?

类似于multiprocessing的其他解决方案(例如这个(,我尝试使用p.imap(my_function, zip(values_list, repeat(factor)))p.imap(my_function(factor), values_list),但它们不起作用。

注意:我不一定要使用多进程。如果你知道使用其他软件包的解决方案,我会接受。

执行许多并行任务。我通常使用ThreadPoolExecutor。在这里,我根据您的源代码做一个小例子。

from concurrent.futures import ThreadPoolExecutor
from functools import partial
import pickle

def my_function(f):
d = f*10
with open(f"{v}.p", "wb") as f:
pickle.dump(d, f, pickle.HIGHEST_PROTOCOL)

if __name__ == "__main__":
f = [1,2,3,4,5,6,7,8] # I assume the parameter f is a number.
with ThreadPoolExecutor() as executor:
fn = partial(my_function)
executor.map(fn, f)

有关更多详细信息,您可以参考以下链接:

concurrent.futures

相关内容

  • 没有找到相关文章

最新更新