同期呼び出しと非同期呼び出し

1828 ワード

同期呼び出しと非同期呼び出しは、タスクをコミットする2つの方法です.
≪同期呼び出し|Synchronize Call|emdw≫:タスクの発行が完了すると、タスクの実行が完了するまでその場で待機し、実行結果/戻り値を取得してから次のステップを実行します.同期呼び出しの次のタスクはシリアル実行です.
非同期呼び出し:タスクをコミットした後、タスクの実行が完了するのをその場で待つことなく、次の行のコードを直接実行し、非同期呼び出し時に同時実行します.
非同期呼び出し、ほぼ同時にタスクを送信
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
 

シリアル実行で効率が低下します.