Python學習之多進程詳解
進程詳解
並行與並發怎麼理解?
並發:當前任務數多於處理器的核心數,稱之為並發
並行:當前任務數少於或等於處理器核心數,稱之為並行
為了充分利用多核CPU資源,Python中大部分情況下都需要使用多進程。
在python中我們如何創建多進程?
進程和線程的區別
我們經常迷惑於多進程和多線程,長的好像一樣,但是他們有本質上的區別,很多大佬也對進程和線程的概念做了很多通俗易懂的解釋,這裡我們引用阮一峰老師的博文,大家可以先去看看,理清楚線程和進程的區別。
進程與線程的一個簡單解釋(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html)
python如何創建多進程
創建多進程的方法有什麼區別?
使用os 模塊中的 os.fork()創建進程
在這裡使用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 AI開發系列02
TAG:Python |