我已经编写了一些代码来并行处理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