PythonでTrioを使用し非同期なタスクを実行し結果を取得してみます。
今回はTrioを用います。このライブラリ・モジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows11)
■Trioを使用し非同期なタスクを実行し結果を取得する
では、早速Trioを使用し非同期なタスクを実行し結果を取得するスクリプトを書いていきます。
■コード
import trio # 非同期なタスクを定義する関数 async def async_task(name, delay): print(f"{name} を開始します") await trio.sleep(delay) # 指定された秒数待機します print(f"{name} を完了しました") # メインの非同期な関数 async def main(): async with trio.open_nursery() as nursery: # 非同期なタスクを開始します nursery.start_soon(async_task, "タスク1", 2) nursery.start_soon(async_task, "タスク2", 3) # Trioランタイムを起動し、非同期な処理を開始します trio.run(main)
まずは、import trioでTrioモジュールをインポートします。これにより、Trioの非同期処理機能を使用することができます。次に、async def async_task(name, delay):で非同期なタスクを定義するための関数を作成します。async_taskは、name(タスクの名前)とdelay(待機する秒数)の2つの引数を受け取ります。関数が呼び出され、print(f”{name} を開始します”)でタスクの開始を示すメッセージを出力します。なお、f文字列(f-strings)を用いてPythonの文字列内で変数や式を埋め込みます。出力後、await trio.sleep(delay)でtrio.sleep()関数を使用して、指定された秒数だけ待機します。これにより、非同期なタスクが一時停止し、他のタスクが実行される機会が与えられます。その後、print(f”{name} を完了しました”):タスクの完了を示すメッセージを出力します。
続いてasync def main():でメインの非同期な関数を定義します。main関数は、トリオのネストされたコンテキストマネージャ(async with trio.open_nursery() as nursery)内で実行されます。async with trio.open_nursery() as nursery:は、Trioのネストされたコンテキストマネージャを使用して、複数の非同期なタスクを管理します。nurseryは、非同期なタスクの実行をスケジュールするために使用されます。
そしてnursery.start_soon(async_task, “タスク1”, 2)で、nursery.start_soon()メソッドを使用して、非同期なタスクを開始します。最初の引数は実行する非同期な関数であり、ここではasync_task関数です。2番目と3番目の引数は、async_task関数に渡されます。今回は”タスク1″という名前のタスクを2秒間待機する非同期なタスクとして開始します。次にnursery.start_soon(async_task, “タスク2”, 3)で、先ほど同様に、”タスク2″という名前のタスクを3秒間待機する非同期なタスクとして開始します。
trio.run(main)は、Trioランタイムを起動し、非同期な処理を開始します。trio.run()関数は、指定した非同期な関数(今回の場合ではmain関数)を実行します。Trioランタイムは、非同期なタスクのスケジューリングと実行を管理します。
■検証・実行
今回書いたスクリプトを「asy_task.py」という名前でPythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると、”タスク1″と”タスク2″という2つの非同期なタスクが並列に実行されることが確認でき、さらに”タスク1″は2秒間待機し、”タスク2″は3秒間待機していることも確認できました。
コメント