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

python程序池apply與apply_async

程序池Pool中的apply方法與apply_async的區別

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

import time
from multiprocessing import Pool
def run(msg):
    print('msg:%s'%msg)
    # 程式隨眠3秒,
    time.sleep(3)
    print('end')
if __name__=="__main__":
    print("開始執行主程式")
    start_time=time.time()
    # 使用程序池建立子程序
size=3 pool=Pool(size) print("開始執行子程序") for i in range(size): pool.apply(run,(i,)) print("主程序結束耗時%s"%(time.time()-start_time))

程式的執行結果:

開始執行主程式
開始執行子程序
msg:0
end
msg:1
end
msg:2
end
主程序結束耗時9.048467874526978

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

applay基本忽略,達不到多程序效果。apply_async屬於非同步,主程序和子程序同時跑,誰跑的快,誰先。
apply_async程式碼實現多程序耗時

import time
from multiprocessing import Pool
def run(msg):
    print('msg:%s'%msg)
    # 程式隨眠3秒,
    time.sleep(3)
    print('end')
if __name__=="__main__":
    print("開始執行主程式")
    start_time=time.time()
    # 使用程序池建立子程序
    size=3
    pool=Pool(size)
    print("開始執行子程序")
    for i in range(size):
        pool.apply_async(run,(i,))
    print("主程序結束耗時%s"
%(time.time()-start_time))

程式執行的結果

開始執行主程式
開始執行子程序
主程序結束耗時0.033245086669921875

為何apply和apply_async時間上這兩個會差距這麼多呢,
對於你設定的時間等待的3秒為何apply_async總的時間執行還沒有0.1秒呢
答案丟擲:
因為程序的切換是作業系統來控制的,搶佔式的切換模式。
我們首先執行的是主程序,cpu執行很快啊,這短短的幾行程式碼,完全沒有給作業系統程序切換的機會,主程序就執行完畢了,整個程式結束。子程序完全沒有機會切換到程式就已經結束了。

阻塞式的apply

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

非同步非阻塞式的apply_async

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