神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

編程語言 程序員 Python sun菜菜 sun菜菜 2017-10-29

1.進程

1.多任務的引入

有很多的場景中的事情是同時進行的,比如開車的時候手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進行的;在給大家分享之前呢,小編推薦一下一個挺不錯的交流寶地,裡面都是一群熱愛並在學習Python的小夥伴們,大幾千了吧,各種各樣的人群都有,特別喜歡看到這種大家一起交流解決難題的氛圍,群資料也上傳了好多,各種大牛解決小白的問題,這個Python群:330637182 歡迎大家進來一起交流討論,一起進步,儘早掌握這門Python語言。

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

2.fork()

Python的os模塊封裝了常見的系統調用,其中就包括fork,可以在Python程序中輕鬆創建子進程:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

2.getpid()、getppid()

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

3.多進程修改全局變量

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

多進程中,每個進程中所有數據(包括全局變量)都各有擁有一份,互不影響

4.多次fork問題

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

multiprocessing模塊提供了一個Process類來代表一個進程對象,下面的例子演示了啟動一個子進程並等待其結束:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

·group:大多數情況下用不到;Process類常用方法:·is_alive():判斷進程實例是否還在執行;·join([timeout]):是否等待進程實例執行結束,或等待多少秒;·start():啟動進程實例(創建子進程);·run():如果沒有給定target參數,對這個對象調用start()方法時,就將執行對象中的run()方法;·terminate():不管任務是否完成,立即終止;Process類常用屬性:·name:當前進程實例別名,默認為Process-N,N為從1開始遞增的整數;·pid:當前進程實例的PID值;例1:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

例2:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

6.進程的創建-Process子類

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

初始化Pool時,可以指定一個最大進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到指定的最大值,那麼該請求就會等待,直到池中有進程結束,才會創建新的進程來執行,請看下面的實例:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

multiprocessing.Pool常用函數解析:

·apply_async(func[, args[, kwds]]):使用非阻塞方式調用func(並行執行,堵塞方式必須等待上一個進程退出才能執行下一個進程),args為傳遞給func的參數列表,kwds為傳遞給func的關鍵字參數列表;

·apply(func[, args[, kwds]]):使用阻塞方式調用func

·close():關閉Pool,使其不再接受新的任務;

·terminate():不管任務是否完成,立即終止;

·join():主進程阻塞,等待子進程的退出, 必須在close或terminate之後使用;

這裡我們主要分析下1.apply堵塞式

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

說明:當一個函數的參數存在於一個元組或者一個字典中時,用來間接的調用這個函數,並肩元組或者字典中的參數按照順序傳遞給參數。這裡我的理解是當成單線程在執行。

8.進程間通信-QueueProcess之間有時需要通信,操作系統提供了很多機制來實現進程間的通信。1. Queue的使用可以使用multiprocessing模塊的Queue實現多進程之間的數據傳遞,Queue本身是一個消息列隊程序,首先用一個小實例來演示一下Queue的工作原理:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

·Queue.put(item,[block[, timeout]]):將item消息寫入隊列,block默認值為True;

1)如果block使用默認值,且沒有設置timeout(單位秒),消息列隊如果已經沒有空間可寫入,此時程序將被阻塞(停在寫入狀態),直到從消息列隊騰出空間為止,如果設置了timeout,則會等待timeout秒,若還沒空間,則拋出"Queue.Full"異常;

2)如果block值為False,消息列隊如果沒有空間可寫入,則會立刻拋出"Queue.Full"異常;

·Queue.put_nowait(item):相當Queue.put(item, False);

2. Queue實例

注意參數的傳遞

我們以Queue為例,在父進程中創建兩個子進程,一個往Queue裡寫數據,一個從Queue裡讀數據:

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

謝謝閱讀!本文轉載文哦,希望能幫到大家學習到東西!

神級程序員花十天整理的進程乾貨 教你如何快速系統編程!超全!

如有侵權請聯繫小編刪除哦

相關推薦

推薦中...