如何从使用多处理执行的函数中有效地检索 return 值?
how do I efficiently retrieve return value from function executed with multiprocessing?
我有一个多维数组,需要用导入函数计算。 (我正在使用 jupyter notebook,所以我将函数导出到 ipynb 并再次导入)该函数采用一维数组的参数。
#Function
def calculatespi(datagrid,q):
date_time = datagrid['time'][:]
gridvalue = datagrid.values
if np.isnan(np.sum(gridvalue)) != True:
df_precip = pd.DataFrame({"Date": date_time,"precip":gridvalue})
spi_prc = spi.SPI()
spi3_grid = spi_prc.calculate(df_precip, 'Date', 'precip', freq = 'M', scale = 3, fit_type ="lmom", dist_type="gam")
spi3 = spi3_grid['precip_scale_3_calculated_index'].values
else:
spi3 = np.empty((489))
spi3[:] = np.nan
q.put(spi3)
#Main Notebook
if name == "main":
spipi = []
processes = []
for x in range (3):
for y in range(3):
q = multiprocessing.Queue()
p = multiprocessing.Process(target=calculatespi, args= (prcoba[:,x,y],q))
p.start()
processes.append(p)
spipi.append(q.get())
for process in processes:
process.join()
经过数百次尝试,我终于可以从我的问题中检索结果,但它花费的时间比 运行 不使用多处理的时间更长。我该怎么办?
使用 concurrent.futures.ProcessPoolExecutor
让事情变得更容易。
首先,将 calculatespi
中的 q.put(spi3)
替换为 return spi3
并删除 q
参数。那么“主要”代码可以写成
#Main Notebook
if name == "main":
from concurrent.futures import ProcessPoolExecutor
args = []
for x in range (3):
for y in range(3):
args.append(prcoba[:,x,y])
with ProcessPoolExecutor() as executor:
spipi = list(executor.map(calculatespi, args))
执行者负责其他一切。
我有一个多维数组,需要用导入函数计算。 (我正在使用 jupyter notebook,所以我将函数导出到 ipynb 并再次导入)该函数采用一维数组的参数。
#Function
def calculatespi(datagrid,q):
date_time = datagrid['time'][:]
gridvalue = datagrid.values
if np.isnan(np.sum(gridvalue)) != True:
df_precip = pd.DataFrame({"Date": date_time,"precip":gridvalue})
spi_prc = spi.SPI()
spi3_grid = spi_prc.calculate(df_precip, 'Date', 'precip', freq = 'M', scale = 3, fit_type ="lmom", dist_type="gam")
spi3 = spi3_grid['precip_scale_3_calculated_index'].values
else:
spi3 = np.empty((489))
spi3[:] = np.nan
q.put(spi3)
#Main Notebook
if name == "main":
spipi = []
processes = []
for x in range (3):
for y in range(3):
q = multiprocessing.Queue()
p = multiprocessing.Process(target=calculatespi, args= (prcoba[:,x,y],q))
p.start()
processes.append(p)
spipi.append(q.get())
for process in processes:
process.join()
经过数百次尝试,我终于可以从我的问题中检索结果,但它花费的时间比 运行 不使用多处理的时间更长。我该怎么办?
使用 concurrent.futures.ProcessPoolExecutor
让事情变得更容易。
首先,将 calculatespi
中的 q.put(spi3)
替换为 return spi3
并删除 q
参数。那么“主要”代码可以写成
#Main Notebook
if name == "main":
from concurrent.futures import ProcessPoolExecutor
args = []
for x in range (3):
for y in range(3):
args.append(prcoba[:,x,y])
with ProcessPoolExecutor() as executor:
spipi = list(executor.map(calculatespi, args))
执行者负责其他一切。