本來的主進程是當前運行的程序 執行到os.fork()時候,又創建了一個子進程 主進程向下執行,子進程也繼續向下運行,根據返回值的不同分別執行下面的代碼 可以使用os.getpid()得到當前進程的父進程的進程號
如果父進程先執行完畢,那麼先退出,子進程可以繼續執行,即他們各自執行,代碼是同一份代碼,但數據是各自獨有的,互不影響,哪怕是全局變量,也不互相影響。
fork只能用在類Linux系統中,不能再Windows 那麼python提供了Process
用fork創建的子進程,可以和主進程不同時執行完畢,而Process方法中,主進程需要等到子進程執行完畢再完成
p.join(timeout) //堵塞,等待p進程結束之後,主程序纔會往下走 p.terminate()直接結束某個子進程
也可以自定義類繼承Process,並重寫run方法 並用自定義類創建的對象調用start方法。 然後start自動調用子類中的run方法,這裏明明沒有start 方法,因爲他在Process類中定義,這裏就用到了工廠方法模式。
進程池:
這裏注意需要加入join 否則主進程關閉後,進程池也會消失,那麼無法繼續執行子進程
pool.apply(worker) 這種方式以堵塞的方式執行 必須執行完一個worker添加後,執行完成纔再進行下一個worker的添加
apply一般不用 一般用apply_async()
進程間通信-Queue:
創建隊列進行參數的傳遞
線程池進行參數傳遞的話 需要創建Manager 然後使用Manager().Queue()隊列傳遞信息