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