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()方法所需的資源。缺點是啟動慢