多进程 - 如何将变量传递给并行执行的函数
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:
我已经编写了一些代码来并行处理 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: