初心者向け!Pythonのコルーチンをハンズオンで学ぼう 3.4

当サイトではアフィリエイト広告を利用しています。

リファレンス

Pythonの**コルーチン(Coroutine)**って聞いたことありますか?
「非同期処理ができるらしいけど、なんだか難しそう…」と思っている方も多いかもしれません。

実は、コルーチンを使うと、プログラムを一時停止・再開しながら効率的に処理を進めることができます!
この記事では、初心者の方でもスムーズに理解できるように、実際にコードを書きながら学べるハンズオン形式で解説していきます!✨


🔹 1. コルーチンって何?

コルーチンとは、async def で定義される特別な関数のこと。
普通の関数とは違い、処理を一時停止(await)したり、再開したりできるのが特徴です。

✅ コルーチンの特徴

✅ 一時停止 (await を使う)
✅ 再開 (await した場所から処理が続く)
✅ 他の処理と並行して実行可能(非同期処理)


🔹 2. コルーチンを実際に書いてみよう!

まずは、基本のコルーチンを書いてみましょう!👇

📝 コルーチンを定義して実行

import asyncio

async def say_hello():
    print("こんにちは!")
    await asyncio.sleep(1)  # 1秒待つ(他の処理が実行できる)
    print("お元気ですか?")

# コルーチンは直接実行できないので、イベントループを使う
asyncio.run(say_hello())

💡 実行結果

こんにちは!
(1秒待つ)
お元気ですか?

この asyncio.sleep(1) の間に、他の処理が動く余地があるのがポイントです!


🔹 3. await を使って並列処理を試す!

次に、複数のコルーチンを同時に動かしてみましょう!

📝 複数のコルーチンを並列実行

import asyncio

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

async def main():
    await asyncio.gather(
        task("タスクA", 2),
        task("タスクB", 1),
        task("タスクC", 3)
    )

asyncio.run(main())

💡 実行結果

タスクA 開始
タスクB 開始
タスクC 開始
(1秒後)
タスクB 終了
(2秒後)
タスクA 終了
(3秒後)
タスクC 終了

🔹 asyncio.gather() を使うことで、タスクを並行実行しています!
🔹 待機時間を無駄にせず、他の処理が進むのが非同期処理のメリット!


🔹 4. 実践!コルーチンでWebスクレイピング(疑似版)

次に、非同期処理を活かして、複数のWebサイトに同時にアクセスするイメージを作ってみましょう!

📝 複数サイトへ非同期でアクセス

import asyncio

async def fetch_data(site):
    print(f"{site} へアクセス中...")
    await asyncio.sleep(2)  # ネットワーク待機をシミュレーション
    print(f"{site} からデータを取得しました")

async def main():
    sites = ["サイトA", "サイトB", "サイトC"]
    await asyncio.gather(*(fetch_data(site) for site in sites))

asyncio.run(main())

💡 実行結果

サイトA へアクセス中...
サイトB へアクセス中...
サイトC へアクセス中...
(2秒後)
サイトA からデータを取得しました
サイトB からデータを取得しました
サイトC からデータを取得しました

ポイント ✅
asyncio.gather() で複数の fetch_data を並列に実行!
await asyncio.sleep(2) で、ネットワーク待機をシミュレーション!

もし同期処理(普通の関数)だったら、6秒かかるはずの処理が2秒で終わるのがポイント!


🔹 5. 通常の関数とコルーチンを組み合わせる

async 関数は、通常の関数の中では await できません。
そこで、普通の関数からコルーチンを呼ぶには、イベントループを管理する必要があります!

📝 通常の関数からコルーチンを実行

import asyncio

async def say_hello():
    print("Hello, World!")
    await asyncio.sleep(1)
    print("Goodbye!")

def run_coroutine():
    asyncio.run(say_hello())

run_coroutine()

asyncio.run() を使えば、通常の関数 (run_coroutine()) からコルーチンを実行可能!


🔹 6. まとめ

💡 Pythonのコルーチン、これだけは覚えておこう!

async def でコルーチンを定義!
await を使うと非同期処理を待機できる!
asyncio.run() でコルーチンを実行!
asyncio.gather() で複数のコルーチンを並列実行!

Pythonの非同期処理を使いこなせば、ネットワーク通信や大量のデータ処理も効率的にこなせるようになります!
ぜひ実際にコードを書いて試してみてくださいね! 🚀✨