一、操做系統中提供了一個fork()函數,它很是特殊。普通函數的調用,調用依次,返回一次。可是fork()函數調用一次,返回2次。由於操做系統自動把當前進程(父進程)複製了一份(子進程),而後分別在父進程和子進程內返回。
子進程永遠返回0,而父進程返回子進程的ID.這樣作的理由是,一個父進程能夠fork出不少子進程,因此父進程要記下每一個子進程的ID,而子進程指須要調用getppid()就能夠拿到父進程的ID.
python中的os 模塊封裝了常見的系統調用,其中就有fork.python程序建立子進程
import os
pid =os.fork()
if pid==0:
子進程
else:
父進程
因爲windows沒有fork調用,而python又是跨平臺的,因此python提供一種跨平臺的多進程支持。multiprocessing模塊就是跨平臺版本的多進程模塊。
multiprocessing模塊提供了一個Process類來表明一個進程對象。
建立一個Process對象,用start方法來啓動
p.start()
p.join()
join方法能夠等待子進程結束後在繼續往下執行,一般用來進程間的同步。
若是要大量產生子進程,能夠用進程池的方式來批量產生子進程。
from multiprocessing import Pool
在 unix/linux 下 multiprocessing 模塊封裝了fork()調用。因爲windows沒有fork調用,所以multiprocessing 須要模擬出fork的效果,父進程全部的python對象都必須經過pickle序列化再傳到子進程去,因此,若是multiprocessing在windows下調用失敗了,要先考慮是否是pickle失敗了。