python程序池apply與apply_async的區別
-
apply方法是阻塞的。
意思就是等待當前子程序執行完畢後,在執行下一個程序。
例如:執行結果如下:
因為apply是阻塞的,所以進入子程序執行後,等待當前子程序執行完畢,在繼續執行下一個程序。
例如:
有三個程序0,1,2。等待子程序0執行完畢後,在執行子程序1,然後子程序2,最後回到主程序執行主程序剩餘部分,就像上面的執行結果一樣。
相當於:這樣好像跟單程序序列執行沒什麼區別了。
-
apply_async 是非同步非阻塞的。
意思就是:不用等待當前程序執行完畢,隨時根據系統排程來進行程序切換。
例如:執行結果如下:
完全沒有等待子程序執行完畢,主程序就已經執行完畢,並退出程式。
為什麼會這樣呢?
因為程序的切換是作業系統來控制的,搶佔式的切換模式。
我們首先執行的是主程序,cpu執行很快啊,這短短的幾行程式碼,完全沒有給作業系統程序切換的機會,主程序就執行完畢了,整個程式結束。子程序完全沒有機會切換到程式就已經結束了。
apply是阻塞式的。
首先主程序開始執行,碰到子程序,作業系統切換到子程序,等待子程序執行結束後,在切換到另外一個子程序,直到所有子程序執行完畢。然後在切換到主程序,執行剩餘的部分。
apply_async是非同步非阻塞式的。
首先主程序開始執行,碰到子程序後,主程序說:讓我先執行個夠,等到作業系統進行程序切換的時候,在交給子程序執行。以為我們的程式太短,然而還沒等到作業系統進行程序切換,主程序就執行完畢了。
想要子程序執行,就告訴主程序:你等著所有子程序執行完畢後,在執行剩餘部分。
畫紅圈的地方及時我們要告訴主程序,你等著所有子程序執行完畢後在執行剩餘部分。
注意:close必須在join前呼叫。
執行結果如下:
你看,因為apply_async是非同步非阻塞式,不用等待當前程序執行完畢,隨時跟進作業系統排程來進行程序切換。
程序0沒有執行完,就切換到程序1開始執行,程序1沒有執行完,就切換到程序2,然後在切換回去。等待所有子程序執行完畢後,最後切換回主程序,執行剩餘部分。
非同步非阻塞式:
總耗時:3秒多。我們每個子程序休眠3秒,正因為是非同步非阻塞式的,不用等待當前執行的子程序執行完畢,隨時根據系統排程來進行程序切換。基本上主程序和三個子程序,四個程序是同時執行的。
阻塞式:
總耗時:9秒多。以為是阻塞式,需要等待當前子程序執行完畢後,在執行下一個子程序。每個子程序休眠3秒,三個子程序休眠9秒。基本上主程序加上子程序,四個程序就相當於在單程序中序列執行的。