Pythonでasyncとawaitキーワードを使用し複数の非同期関数を定義し遅延時間を指定し処理してみます。
■今回の環境(Python)
今回のPythonはバージョン3.8.5を用いる。(Mac OS)
■asyncとawaitキーワードを使用し複数の非同期関数を定義し遅延時間を指定し処理する
では、asyncとawaitキーワードを使用し複数の非同期関数を定義し遅延時間を指定し処理するために、スクリプトを書いていきます。
■コード
import asyncio # 非同期関数 async def async_function(name, delay): print(f"{name} 開始") await asyncio.sleep(delay) print(f"{name} 終了") # メイン関数 async def main(): print("非同期処理を開始") # 非同期関数の並行実行 task1 = async_function("Task 1", 2) task2 = async_function("Task 2", 1) task3 = async_function("Task 3", 3) await asyncio.gather(task1, task2, task3) print("非同期処理が完了") # イベントループの作成と実行 loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
まずimportでasyncioによりasyncioモジュールをインポートします。インポート後、asyncio.get_event_loop()を使用してイベントループを作成します。loop.run_until_complete(main())を呼び出して、メインの非同期処理を実行します。この呼び出しは非同期処理が完了するまでブロックされます。loop.close()を呼び出してイベントループをクローズします。
次にasync_function(name, delay)の定義。この非同期関数は2つの引数、パラメータを受け取ります。引数、パラメータは、name(処理の名前)とdelay(遅延時間)です。開始メッセージをprint() で出力し、asyncio.sleep()を使って指定された時間だけ非同期に待機します。待機が完了すると終了メッセージをprint() で出力します。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。
次にmain()(メイン関数)の定義。この非同期関数はメインの処理フローを定義しています。開始メッセージをprint() で出力します。async_function()を呼び出して3つの非同期タスク(task1、task2、task3)を作成します。それぞれのタスクは異なる遅延時間を持ちます。asyncio.gather()を使用して、すべてのタスクが完了するまで待機します。これにより、3つの非同期タスクが並行して実行されます。
非同期処理が完了したことを示すメッセージをprint() で出力します。
これで、メイン関数の実行が開始され、「非同期処理を開始」というメッセージがprint() で出力します。async_function()を呼び出して3つの非同期タスクが作成されます。それぞれのタスクは異なる遅延時間を持ちます。asyncio.gather()により、3つのタスクが並行して実行されます。各タスクは指定された遅延時間の間非同期に待機します。タスクの実行が終了すると、各タスクの開始と終了のメッセージがprint() で出力されます。全てのタスクが完了すると、「非同期処理が完了「というメッセージがprint() で出力されます。メイン関数の実行が終了し、イベントループがクローズされます。
■実行・検証
このスクリプトを「multi_task.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、ターミナルから実行してみます。
実行してみると、複数の非同期関数が並行して実行され、各タスクの処理が適切なタイミングで開始・終了されることを確認することができました。
コメント