PR

Python初心者必見!10分で理解する非同期プログラミング入門

Python
スポンサーリンク

非同期プログラミングは、Pythonで効率的なコードを書くための重要な手法です。本記事では、非同期プログラミングの基本概念から、Pythonでの実装方法、具体的なコード例までを初心者向けに詳細に解説します。非同期処理を活用し、I/O操作が多いプログラムのパフォーマンスを向上させましょう。

1. 非同期プログラミングとは?

非同期プログラミングとは、時間のかかる処理(例:ファイルの読み書き、ネットワーク通信など)を待つ間に、他の処理を並行して実行することでプログラムの効率を向上させる手法です。

通常、同期プログラミングでは、ある処理が終わるまで次の処理を開始できません。例えば、ネットワークからデータを取得する処理が完了するまで他の処理が止まってしまいます。しかし、非同期プログラミングを使うことで、ネットワーク通信の待ち時間の間に他の処理を進めることが可能になります。

2. Pythonにおける非同期処理の基本

Pythonでは、非同期処理を行うためにasyncioモジュールが提供されています。Python 3.5以降では、asyncおよびawaitキーワードが導入され、非同期処理の記述が直感的になりました。

  • async を付けることで非同期関数を定義できます。
  • await を使うことで、非同期処理の完了を待機することができます。

3. async と await の使い方

asyncとは?

asyncは、関数を非同期関数として定義するためのキーワードです。通常の関数とは異なり、非同期関数は await を含むことができます。

awaitとは?

awaitは、非同期関数内で時間のかかる処理を待機するためのキーワードです。await を付けることで、その処理が完了するまで他の処理が並行して進行できます。

4. 非同期関数の実装例

複数のタスクを並行して実行する

import asyncio

async def task(name, duration):
    print(f"Task {name} 開始")
    await asyncio.sleep(duration)
    print(f"Task {name} 完了")

async def main():
    tasks = [task("A", 2), task("B", 1), task("C", 3)]
    await asyncio.gather(*tasks)

asyncio.run(main())

5. 非同期処理を活用したI/O操作

必要なパッケージのインストール

非同期プログラミングを行うために、以下のパッケージをインストールします。

pip install aiofiles

ファイルの準備

コードを実行する前に、必要なファイルを作成してください。

filenames = ["file1.txt", "file2.txt", "file3.txt"]
for filename in filenames:
    with open(filename, "w") as f:
        f.write(f"Hello from {filename}\n")
print("ファイルを作成しました。")

このスクリプトを実行することで、file1.txtfile2.txtfile3.txt が作成され、エラーなく動作するようになります。

非同期で複数のファイルを読み込む

import asyncio
import aiofiles

async def read_file(filename):
    async with aiofiles.open(filename, 'r') as f:
        content = await f.read()
        print(f"{filename}の内容: {content}")

async def main():
    files = ["file1.txt", "file2.txt", "file3.txt"]
    tasks = [read_file(file) for file in files]
    await asyncio.gather(*tasks)

asyncio.run(main())

6. 非同期プログラミングの注意点

1. CPUバウンドな処理には向かない

非同期処理はI/Oバウンドな処理に適しており、CPU集約型の処理には向いていません。CPUを多く使う処理にはconcurrent.futures を活用する方が適しています。

2. asyncio.run() の使用制限

asyncio.run() は1つのプログラムで1回だけ呼び出すのが推奨されています。

3. async 関数の中で time.sleep() を使わない

8. まとめと次のステップ

Pythonの非同期プログラミングを学ぶことで、より効率的なプログラムを開発できるようになります。次のステップとして、

  • aiohttp を活用した非同期HTTPリクエストの実装
  • 並列処理との違いを理解し、適材適所で使い分ける

を試してみましょう!

原稿執筆 株式会社GROWTH JAPAN TECHNOLOGIES
我妻裕太

GROWTH JAPAN TECHNOLOGIESは宮城県仙台市のAI企業です。

コメント

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