因为要写的算法里面有可以并行的部分,所以考虑使用多线程或者多进程。在网上看到计算密集型的任务最好还是使用python的多进程,所以先测试一下python3里面的multiprocessing的使用。
因为需要在主进程获得创建的子进程的执行结果,所以使用Queue来进行通信。python3 的multiprocessing 下面有个Queue, 并且multiprocessing 的Manager 里面也有个Queue。使用后者才可以正确运行(我用的版本是python3.6)。创建进程时,将Queue 传入参数args里,子进程完成后,通过put方法将结果保存到里面,主进程在join等待所有子进程结束后通过get方法获取结果。
在使用多进程的时候需要注意,子进程执行的那个函数需要保证能够正确运行。否则在多进程执行的时候,会发现子进程并没有执行完毕,但是主进程已经执行到join方法后面了。因为子进程执行出现错误后会退出,但是是看不到报错的。所以,在使用多进程之前最好先用单个进程跑一遍,保证没有错误再用多进程。
下面是个简单的示例:
from multiprocessing import Pool,Manager
def func(que,i):
print('sub process running:'+str(i))
que.put('sub process info:'+str(i))
if __name__ == '__main__':
process_pool = Pool(4)
que = Manager().Queue()
for i in range(4):
process_pool.apply_async(func,args=(que,i))
process_pool.close()
process_pool.join()
print('sub processes finished')
for i in range(4):
print(que.get())
执行结果: