當前位置:
首頁 > 最新 > Python學習之多進程詳解

Python學習之多進程詳解

進程詳解

並行與並發怎麼理解?

並發:當前任務數多於處理器的核心數,稱之為並發

並行:當前任務數少於或等於處理器核心數,稱之為並行

為了充分利用多核CPU資源,Python中大部分情況下都需要使用多進程。

在python中我們如何創建多進程?


進程和線程的區別

我們經常迷惑於多進程和多線程,長的好像一樣,但是他們有本質上的區別,很多大佬也對進程和線程的概念做了很多通俗易懂的解釋,這裡我們引用阮一峰老師的博文,大家可以先去看看,理清楚線程和進程的區別。

進程與線程的一個簡單解釋(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html)

python如何創建多進程

創建多進程的方法有什麼區別?


在這裡使用os.fork()創建進程後會返回兩個值,其中一個值為零。另一個值為創建的子進程ID,在這裡可以使用os.getpid()獲取子進程的ID,可以使用os.getppid()獲取父進程ID。

需要注意的是:在os.fork()創建的子進程中,父進程和子進程執行的是一樣的任務,並且在執行的任務結束時,父進程會自行結束,不會等待子進程結束之後結束。

使用multiprocessing模塊創建多進程

其中:

同時在Process類中提供以下幾個方法用於實現進程的操作:

舉個栗子:

使用multiprocessing中的Pool類創建進程池對象

使用Pool類創建進程的方法和使用Process類創建進程的方法基本類似。

但是需要注意一下幾點:

舉個栗子:

進程之間如何通信?

進程間通信有很多中方式,包含但不限於命名管道,無名管道,共享內存,隊列等。主要學習一下隊列-Queue的使用

Queue的使用

首先實例化Queue對象,例如:p = Queue(num)其中num可以為空或負數代表可接受的消息無上限。

如果block使用默認值,且沒有設置timeout(單位秒),消息列隊如果為空,此時程序將被阻塞(停在讀取狀態),直到從消息列隊讀到消息為止,如果設置了timeout,則會等待timeout秒,若還沒讀取到任何消息,則拋出Queue.Empty異常;如果block值為False,消息列隊如果為空,則會立刻拋出Queue.Empty異常;

舉個栗子:

再舉個栗子:

進程池中的Queue的使用

Pool創建進程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否則會得到一條如下的錯誤信息:

舉個栗子:

寫在後面

這是鹹魚的第一篇python學習筆記,好像很久沒有更文了,不是因為懶,因為鹹魚在學習。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

十行Python代碼搞定圖片中的物體檢測
從零開始學Python AI開發系列02

TAG:Python |