1. 程式人生 > >同步呼叫與非同步呼叫

同步呼叫與非同步呼叫

同步呼叫和非同步呼叫是兩種提交任務的方式

同步呼叫:提交完任務後,就在原地等待任務執行完畢,拿到執行結果/返回值後再執行下一步,同步呼叫下任務是序列執行。

非同步呼叫:提交完任務後,不會再原地等待任務執行完畢,直接執行下一行程式碼,非同步呼叫時併發執行。

非同步呼叫,幾乎同時下達任務

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
主

序列執行,效率低下。