如何从使用多处理执行的函数中有效地检索 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))

执行者负责其他一切。