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