Pythonの非同期処理: asyncioを使った並行実行の基本

スポンサーリンク

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秒ごとにカウントが進み、タスクごとにメッセージが出力されます。最終的に、すべてのタスクがカウントダウンを完了し、最終メッセージが出力されることを確認できました。

コメント

タイトルとURLをコピーしました