同步呼叫與非同步呼叫
阿新 • • 發佈:2019-02-06
同步呼叫和非同步呼叫是兩種提交任務的方式
同步呼叫:提交完任務後,就在原地等待任務執行完畢,拿到執行結果/返回值後再執行下一步,同步呼叫下任務是序列執行。
非同步呼叫:提交完任務後,不會再原地等待任務執行完畢,直接執行下一行程式碼,非同步呼叫時併發執行。
非同步呼叫,幾乎同時下達任務
from concurrent.futures import ProcessPoolExecutor import os, time,random def task(x): print("%s is running" % os.getpid()) time.sleep(random.randint(1,3)) return x**2 if __name__=="__main__": p = ProcessPoolExecutor() futures = [] for i in range(10): future = p.submit(task,i)#返回計算結果 futures.append(future) p.shutdown(wait=True)#預設waiti為True 等待十個程序任務執行完,關閉程序池的入口。 for future in futures: print(future.result()) print("主")
結果為:
10760 is running
10564 is running
12848 is running
3928 is running
10564 is running
12848 is running
10760 is running
3928 is running
10760 is running
10564 is running
0
1
4
9
16
25
36
49
64
81
主
如果把p.shutdown(wait=True)去掉,則會出現結果穿插在程序中
2908 is running 8092 is running 10376 is running 13136 is running 8092 is running 2908 is running 0 1 8092 is running 10376 is running 4 2908 is running 10376 is running 9 16 25 36 49 64 81 主
同步呼叫:
def task(x):
print("%s is running" % os.getpid())
time.sleep(random.randint(1,3))
return x**2
if __name__=="__main__":
p = ProcessPoolExecutor()
for i in range(10):
res = p.submit(task,i).result()#返回計算結果
print(res)
print("主")
結果為: 8360 is running 0 472 is running 1 4888 is running 4 12980 is running 9 8360 is running 16 472 is running 25 4888 is running 36 12980 is running 49 8360 is running 64 472 is running 81 主
序列執行,效率低下。