Pythonの非同期処理: asyncioを使った並行実行の基本について解説します。
今回はasyncioを使った並行実行の基本として、3つの非同期タスクが同時に実行されるスクリプトを書いて、スクリプトを実行してみます。
■今回の環境(Python)
今回のPythonはバージョン3.8.5を用いる。(Mac OS)
■asyncioを使った並行実行のスクリプト
では、早速asyncioを使った並行実行のスクリプトを書いていきます。
■コード
import asyncio # 非同期関数 async def count_down(name, count): for i in range(count, 0, -1): print(f"{name}: {i}") await asyncio.sleep(1) print(f"{name}: カウントダウン完了") # メイン関数 async def main(): # 非同期処理の並行実行 task1 = count_down("Task 1", 5) task2 = count_down("Task 2", 3) task3 = count_down("Task 3", 7) await asyncio.gather(task1, task2, task3) # イベントループの作成と実行 loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
まずimportでasyncioによりasyncioモジュールをインポートします。インポート後、count_down() 関数を定義します。この関数は非同期関数として定義します。引数、パラメータとしてタスク名(name)とカウント回数(count)を受け取ります。forループを使用して指定された回数のカウントダウンを行います。カウントダウンの間にはawait asyncio.sleep(1)を使用して1秒の遅延を挿入します。これにより、1秒ごとにカウントが進むようになります。カウントダウンが完了したら、「{タスク名}: カウントダウン完了」というメッセージをprintで出力します。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。
次にmain()関数を定義します。この関数も非同期関数として定義します。非同期処理の並行実行を行うために、asyncio.gather()を使用して複数のタスクを同時に実行します。count_down()関数を呼び出して3つのタスクを作成し、それぞれ異なるカウント回数を指定します。await asyncio.gather(task1, task2, task3)によって、3つのタスクが並行して実行されます。gather()はタスクの完了を待ち合わせる役割を果たします。
次にメインプログラムを作成します。作成のために、イベントループを作成し、main()関数を実行します。loop.run_until_complete(main())によって、main関数の実行が開始されます。イベントループは非同期処理を管理し、タスクの進行や完了を制御します。すべてのタスクが完了したら、main関数の実行が終了し、イベントループも終了します。
■実行・検証
このスクリプトを「count_down_asy.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、ターミナルから実行してみます。
実行してみると、3つの非同期タスクが同時に実行され、それぞれがカウントダウンを行います。1秒ごとにカウントが進み、タスクごとにメッセージが出力されます。最終的に、すべてのタスクがカウントダウンを完了し、最終メッセージが出力されることを確認できました。
コメント