官术网_书友最值得收藏!

3.1 創建進程的類Process

multiprocessing模塊提供了一個創建進程的類Process,其創建進程有以下兩種方法。


創建一個Process類的實例,并指定目標任務函數。

自定義一個類并繼承Process類,重寫其__init__()方法和run()方法。


我們首先使用第一種方法創建兩個進程,并與單進程運行的時間做比較。


【示例3-1】定義耗時任務,并對比單進程和多進程耗時(multi_process.py)。

上面的代碼首先定義了一個上億次數據累加的耗時函數,在運行結束時打印調用此函數的進程ID,第14和15行是單進程執行,第18和19行分別實例化了Process類,并指定目標函數為task_process,第21和22行是雙進程并行執行,執行完成后打印耗時。其運行結果如下:

父進程pid為 2116.
進程pid為 2116,執行完成
進程pid為 2116,執行完成
順序執行耗時 37.13105368614197
進程pid為 60624,執行完成
進程pid為 41016,執行完成
多進程并發執行耗時 24.04837417602539

我們發現多進程執行相同的操作次數耗時更少。接下來我們使用第二種方法實現【示例3-1】。


【示例3-2】自定義一個類并繼承Process類(multi_process2.py)。

提示

進程p0、p1在調用start()時,自動調用其run()方法。

運行結果如下:

父進程pid為 57228.
進程pid為 59932,執行完成
進程pid為 61288,執行完成
多進程并發執行耗時 24.03329348564148

下面我們來看一下Process類還有哪些功能可以使用,該類的構造函數原型如下。

class multiprocessing.Process(group=None, target=None, name=None, args=(),
kwargs={}, *, daemon=None)

參數說明如下。


target表示調用對象,一般為函數,也可以為類。

args表示調用對象的位置參數元組。

kwargs表示調用對象的字典。

name為進程的別名。

group參數不使用,可忽略。


類提供的常用方法如下。


is_alive():返回進程是否是激活的。

join([timeout]):阻塞進程,直到進程執行完成或超時或進程被終止。

run():代表進程執行的任務函數,可被重寫。

start():激活進程。

terminate():終止進程。


屬性如下。


authkey:字節碼,進程的準密鑰。

daemon:父進程終止后自動終止,且不能產生新進程,必須在start()之前設置。

exitcode:退出碼,進程在運行時為None,如果為–N,就表示被信號N結束。

name:獲取進程名稱。

pid:進程id。


【示例3-3】不設置daemon屬性(multi_process_no_daemo.py)。

這里沒有使用p0.join()來阻塞進程。運行結果如下:

2018-07-11 21:13:30 父進程執行開始
2018-07-11 21:13:30 父進程執行結束
2018-07-11 21:13:30 子進程執行開始
sleep 3s
2018-07-11 21:13:33 子進程執行結束

可以看出,父進程并沒有等待子進程運行完成就打印了退出信息,程序依然會等待子進程運行完成。


【示例3-4】設置daemon屬性(multi_process_daemo.py)。

運行結果如下:

2018-07-11 21:17:33 父進程執行開始
2018-07-11 21:17:33 父進程執行結束

程序并沒有等待子進程結束而結束,只要主程序運行結束,程序即退出。

主站蜘蛛池模板: 陵川县| 威信县| 金坛市| 利川市| 筠连县| 秦安县| 三河市| 木兰县| 临颍县| 民县| 兴国县| 巴彦淖尔市| 弥渡县| 阜平县| 土默特左旗| 珲春市| 石河子市| 长汀县| 西乌| 宁阳县| 泾阳县| 龙川县| 时尚| 高雄市| 安西县| 迁西县| 岳阳市| 黄大仙区| 太谷县| 启东市| 曲靖市| 大丰市| 泌阳县| 阿尔山市| 成武县| 古丈县| 大理市| 兴和县| 九龙县| 西藏| 邢台县|