multiprocessing在每创建一个进程时,会将主进程的内存空间原封不动的复制一份到子进程,这样一来内存消耗很容易就翻几倍,导致程序无法运行。
究其原因,是启动进程时采用了os.fork(),使子进程继承父进程全部资源
那么如何解决呢?
1. 最有效的方法:创建完进程后,再加载大内存变量
import multiprocessing from multiprocessing import Process, Pool, Queue import numpy as np # 先创建进程池,只复制当前资源 p = Pool(16) m = multiprocessing.Manager() q = m.JoinableQueue() # 加载大内存变量 larg_mem = np.random.normal(1.0, 0.1, 10000000) # 启动子进程 for i in range(100): p.apply_async(process, args=(i, )) p.close() p.join()
2. 共享内存
3. python3可以指定启动方式
multiprocessing.set_start_method('spawn')
子进程将只继承运行run()方法所需的资源。缺点是启动慢