Pythonでasyncioを用いて非同期で実行されるプログラムを作成します。
なお、AsyncioはPythonの標準ライブラリであり、非同期処理を行うためのライブラリです。またPythonにおける非同期(Asynchronous)は、コードが順序を追って次々に実行されるわけではなく、タスクの実行順序が保証されないプログラムの書き方です。
■Python
Google Colaboratory(Google Colab),2023年3月18日時点ではPython 3.9.16が用いられる。
■asyncioを用いて非同期で実行されるプログラムを作成する
では、早速asyncioを用いて非同期で実行されるプログラムを作成しますので、コードを書いていきます。
■コード
import asyncio async def count(): print("One") await asyncio.sleep(1) print("Two") async def main(): await asyncio.gather(count(), count(), count()) if __name__ == "__main__": asyncio.run(main())
まずはimportでasyncioを呼び出します。その後、async defを用いてcount()という非同期関数を定義します。この関数が呼び出された時に実行される処理として、print()で文字列を出力し、awaitとasyncio.sleep()を用いて非同期関数内で別の非同期関数(asyncio.sleep())を呼び出し、その関数が完了するまで処理を待機するというものです。別の非同期関数(asyncio.sleep())を呼び出した時に実行される処理は、print()で先ほどとは異なる文字列を出力するものです。
次にasync defを用いてmain()という非同期関数を定義します。この関数が呼び出された時に実行される処理として、awaitとasyncio.gather()を用いて非同期関数内で別の非同期関数(asyncio.gather())を呼び出し、その関数が完了するまで処理を待機するというものです。なお、asyncio.gather()は非同期処理で並列に複数のコルーチン(通常の関数と異なり一度中断した処理を再開できるもの)を実行するための関数です。この関数の括弧内に引数,パラメータとして、複数のcount()関数を渡します。これで同時に関数を呼び出し、全ての非同期処理が完了するまで待機されます。
最後にファイルが直接実行された場合にのみ実行されるブロックである「if __name__ == “__main__”:」を記述し、その中にasyncio.run()を用います。括弧内には引数,パラメータとして、main()を渡します。これでイベントループ(非同期に実行される複数のタスクを制御するために使われる仕組み)を作成し、イベントループでコルーチンを実行し、最後にコルーチンが完了するとイベントループを閉じます。
■実行・検証
このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。
実行してみると、asyncioを用いて非同期で文字列が出力され、1秒待機した後に別の文字列が出力されることを確認できました。
コメント