1. 程式人生 > >python程序池apply與apply_async的區別

python程序池apply與apply_async的區別

  1. apply方法是阻塞的。
    意思就是等待當前子程序執行完畢後,在執行下一個程序。
    例如:

     

    執行結果如下:

     

    因為apply是阻塞的,所以進入子程序執行後,等待當前子程序執行完畢,在繼續執行下一個程序。
    例如:
    有三個程序0,1,2。等待子程序0執行完畢後,在執行子程序1,然後子程序2,最後回到主程序執行主程序剩餘部分,就像上面的執行結果一樣。
    相當於:

    這樣好像跟單程序序列執行沒什麼區別了。

  2. apply_async 是非同步非阻塞的。
    意思就是:不用等待當前程序執行完畢,隨時根據系統排程來進行程序切換。
    例如:

     

     

    執行結果如下:

     

    完全沒有等待子程序執行完畢,主程序就已經執行完畢,並退出程式。

為什麼會這樣呢?

因為程序的切換是作業系統來控制的,搶佔式的切換模式。
我們首先執行的是主程序,cpu執行很快啊,這短短的幾行程式碼,完全沒有給作業系統程序切換的機會,主程序就執行完畢了,整個程式結束。子程序完全沒有機會切換到程式就已經結束了。

apply是阻塞式的。

首先主程序開始執行,碰到子程序,作業系統切換到子程序,等待子程序執行結束後,在切換到另外一個子程序,直到所有子程序執行完畢。然後在切換到主程序,執行剩餘的部分。

apply_async是非同步非阻塞式的。

首先主程序開始執行,碰到子程序後,主程序說:讓我先執行個夠,等到作業系統進行程序切換的時候,在交給子程序執行。以為我們的程式太短,然而還沒等到作業系統進行程序切換,主程序就執行完畢了。

想要子程序執行,就告訴主程序:你等著所有子程序執行完畢後,在執行剩餘部分。

畫紅圈的地方及時我們要告訴主程序,你等著所有子程序執行完畢後在執行剩餘部分。

注意:close必須在join前呼叫。

執行結果如下:

你看,因為apply_async是非同步非阻塞式,不用等待當前程序執行完畢,隨時跟進作業系統排程來進行程序切換。
程序0沒有執行完,就切換到程序1開始執行,程序1沒有執行完,就切換到程序2,然後在切換回去。等待所有子程序執行完畢後,最後切換回主程序,執行剩餘部分。

非同步非阻塞式:

總耗時:3秒多。我們每個子程序休眠3秒,正因為是非同步非阻塞式的,不用等待當前執行的子程序執行完畢,隨時根據系統排程來進行程序切換。基本上主程序和三個子程序,四個程序是同時執行的。

阻塞式:

總耗時:9秒多。以為是阻塞式,需要等待當前子程序執行完畢後,在執行下一個子程序。每個子程序休眠3秒,三個子程序休眠9秒。基本上主程序加上子程序,四個程序就相當於在單程序中序列執行的。

python官方建議:廢棄apply,使用apply_async。