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

multiprocess - how to pass variables to function executed in parallel

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

它包含一个将一些数据作为输入、转换它们并将结果写入文件的函数:

%%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)

main中调用函数:

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 的其他解决方案(例如 this one)类似,我尝试使用 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)

详情请参考下方link:

concurrent.futures