技術共有

Python のコルーチンとは何か、Python で非同期プログラミングを実装する方法

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

コルーチン

コルーチンは、プログラムへの複数のエントリ ポイントを使用して、特定の場所で実行を一時停止および再開できるようにするプログラム コンポーネントです。スレッドやプロセスとは異なり、コルーチンの切り替えは、オペレーティング システムによってスケジュールされるのではなく、プログラマによって明示的に制御されます。これにより、実行環境全体 (スレッド スタックなど) を保存および復元する必要がなくなるため、コンテキストの切り替えを実行するときにコルーチンがより軽量になります。

Pythonでは主にコルーチンが渡しますasyncそしてawait達成すべきキーワード。これらのキーワードを使用して定義された関数は「コルーチン関数」と呼ばれ、呼び出されてもすぐには実行されず、代わりにコルーチン オブジェクトを返します。このコルーチン オブジェクトは、イベント ループで実行されるようにスケジュールする必要があります。

非同期プログラミング

非同期プログラミングは、特定の長時間実行操作 (I/O 操作など) が完了するのを待ちながら、プログラムが他のタスクの実行を継続できるようにする同時実行モデルです。 Python では、非同期プログラミングはコルーチンでよく使用され、その実行はイベント ループを通じてスケジュールされます。

Python で非同期プログラミングを実装する方法

1. 使用するasyncそしてawait
  • コルーチン関数を定義する:使用async defコルーチン関数を定義します。
  • コルーチンを待つ: コルーチン関数内で次を使用できます。await別のコルーチンまたは非同期操作が完了するまで待機します。
2. イベントループを使用する
  • パイソンasyncioライブラリはイベント ループの実装を提供します。非同期コードが何らかのイベント ループで実行されることを確認する必要があります。
  • 使用asyncio.run(main())メインのコルーチン関数を実行すると、イベント ループが自動的に作成および管理されます。
3. サンプルコード
 

python复制代码

import asyncio
# 定义一个异步函数,模拟一个耗时的I/O操作
async def fetch_data(url):
print(f"Fetching {url}...")
# 模拟耗时操作
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# 同时启动多个异步任务
task1 = asyncio.create_task(fetch_data('http://example.com/data1'))
task2 = asyncio.create_task(fetch_data('http://example.com/data2'))
# 等待所有任务完成
result1, result2 = await asyncio.gather(task1, task2)
print(result1)
print(result2)
# 运行主协程
asyncio.run(main())

この例では、fetch_dataネットワークリクエストをシミュレートする非同期関数です。main関数では 2 つを同時に開始しましたfetch_data非同期タスクと使用await asyncio.gather()同時に終了するまで待ちます。

4. 注意事項
  • 非同期プログラミングとコルーチンを使用すると、同時実行性への対処が容易になりますが、非同期コンテキスト管理、エラー処理などの新たな複雑さも生じます。
  • 非同期コードを設計するときは、どの操作がブロックしているか (同期 I/O 操作など) に特に注意し、可能な限り非同期バージョンのライブラリと API を使用してください。
  • asyncioこれは Python 標準ライブラリの一部であり、コルーチンと非同期プログラミングをサポートするために使用されます。などの豊富なAPIも提供します。asyncio.Queueasyncio.Lock非同期コードでの同時実行性と同期の問題を処理するためなど。