在之前用蒙特卡洛算法的时候我曾经舱室过用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)