在之前用蒙特卡洛算法的时候我曾经舱室过用multiprocessing来对for循环进行加速 ,当时效果还是可以的,将循环中的操作包装成一个函数,即可传入可遍历的变量组即可有效利用多个线程进行同时计算。最近在分析自己DEM模拟试验的数据时又遇到了大量独立数据文件的io和分析,但是不同的是这次的计算需要在函数中传入多个变量,不变的要求是最小化业务代码更改。

其实实现起来也很简单,将业务函数进行二次包装,采用 *args 来进行变量传递即可。当然,同样不能忘了,多线程pool的代码一定要在主函数内,下面是我的颗粒信息数据整理例子。

# work code
def ball_pos_plot(ball, speed):
    # plot the sample area and displacement path of a single particle
    return

# wrapper
def multi_wrapper(args):
    return ball_pos_plot(*args)

# multi processing
if __name__ == "__main__":
    pool=Pool(12)

    ball_list=[2020, 22, 16, 100, 1245, 213]

    speed_list=[0.0015,0.001,0.01,0.1]

    args_list=[]

    for ball in ball_list:
        for speed in speed_list:
            args_list.append([ball, speed])

    pool.map(multi_wrapper, args_list)