Pythonでasyncとawaitキーワードを使用し複数の非同期処理を並行して実行してみます。
■今回の環境(Python)
今回のPythonはバージョン3.8.5を用いる。(Mac OS)
■asyncとawaitキーワードを使用し複数の非同期処理を並行して実行する
では、asyncとawaitキーワードを使用し複数の非同期処理を並行して実行するスクリプトを書いていきます。
■コード
import asyncio
# 非同期関数
async def fetch_data(url):
print("データ取得開始:", url)
await asyncio.sleep(2) # ダミーの非同期待機(2秒)
print("データ取得完了:", url)
return "Data from " + url
# メイン関数
async def main():
# 非同期処理の並行実行
tasks = [
fetch_data("https://www.baidu.com"),
fetch_data("https://google.com"),
fetch_data("https://yahoo.co.jp"),
]
results = await asyncio.gather(*tasks)
print("取得したデータ:", results)
# イベントループの作成と実行
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()まずimportでasyncioによりasyncioモジュールをインポートします。インポート後、非同期関数fetch_data(url)を定義します。この関数は指定したURLからデータを非同期に取得します。まず、「データ取得開始:」とURLがprint()で出力されます。その後、await asyncio.sleep(2)により2秒間の非同期待機が行われます。最後に「データ取得完了」とURLがprint()で出力され、return文によって結果が返されます。
次にメイン関数main()を定義します。この関数では、fetch_data()を複数回呼び出して非同期処理を並行して実行します。fetch_data()の呼び出し結果をtasksという”[ ]”(角括弧)を用いたリストに格納します。さらにasyncio.gather(*tasks)を使用して、複数の非同期処理の完了を待機し、結果をresultsに格納します。なお、asyncio.gather()は非同期関数を並行して実行し、その結果をまとめて取得する関数です。
次にイベントループを作成し、メイン関数を実行します。loop = asyncio.get_event_loop()でイベントループを取得し、loop.run_until_complete(main())でメイン関数の非同期処理を実行します。この処理では、非同期処理が実行されるまでブロックされます。メイン関数の非同期処理が完了すると、「取得したデータ:」と結果がprint()で出力されます。
最後に、loop.close()によってイベントループを終了します。
■実行・検証
このスクリプトを「multiple_task.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、ターミナルから実行してみます。

実行してみると、複数(今回は3つ)の非同期処理が並行して実行され、それぞれのデータ取得が完了した後に結果がprint()で出力されることを確認できました。


コメント