Pythonで理解するコルーチンと非同期関数の基本と応用

この記事では、Pythonでのコルーチンと非同期関数について詳しく解説します。具体的なコード例とその解説、応用例を含め、これからPythonの非同期プログラミングに取り組む方々にとって参考になる内容となっています。

目次

コルーチンとは

コルーチンは、プログラムの実行を一時停止し、後から再開できるような関数の一種です。通常の関数は呼び出されると最後まで実行されますが、コルーチンは途中で停止し、後からその状態から再開することが可能です。

Pythonでの基本的なコルーチンの使い方

Pythonでは`yield`キーワードを使ってコルーチンを定義します。

def simple_coroutine():
    print("Start Coroutine")
    x = yield
    print(f"Received: {x}")

# コルーチンの生成
coro = simple_coroutine()

# 最初のyieldまで進む
next(coro)

# 値を送信し、次のyieldまで進む
coro.send(42)

上のコードでは、`simple_coroutine`がコルーチンです。`yield`によってコルーチンが一時停止し、`.send()`メソッドで値を送信することで再開します。

非同期関数とは

非同期関数は、I/Oバウンドやネットワーク関連の処理で使われることが多い関数です。これにより、待機時間中に他のタスクを行うことが可能となり、プログラムの効率が向上します。

Pythonでの非同期関数の基本

Pythonでは`async`と`await`キーワードを使って非同期関数を定義します。

import asyncio

async def hello_async():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

asyncio.run(hello_async())

上のコードでは、`hello_async`が非同期関数です。`await`によって非同期に処理が行われ、その間に他のタスクが実行可能です。

応用例

Webスクレイピング

非同期関数はWebスクレイピングにも利用できます。

from aiohttp import ClientSession
import asyncio

async def fetch(url, session):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with ClientSession() as session:
        html = await fetch("https://www.example.com", session)
        print(html[:100])

asyncio.run(main())

非同期キューの利用

複数のコルーチンでデータを共有する場合には、非同期キューが有用です。

import asyncio

async def producer(queue):
    for i in range(5):
        await queue.put(i)
        await asyncio.sleep(1)

async def consumer(queue):
    while True:
        item = await queue.get()
        print(f"Consumed {item}")

queue = asyncio.Queue()
asyncio.run(asyncio.gather(producer(queue), consumer(queue)))

非同期DB操作

データベース操作も非同期で行えます。

import asyncio
import asyncpg

async def run():
    conn = await asyncpg.connect(user='user', password='password', database='database', host='127.0.0.1')
    await conn.execute('INSERT INTO users(id, name) VALUES(1, 'John Doe')')
    await conn.close()

asyncio.run(run())

まとめ

Pythonでのコルーチンと非同期関数は、効率的なプログラムを書くための重要な要素です。これからPythonで非同期処理を行いたいと考えている方は、本記事がスタート地点となることを願っています。

コメント

コメントする

目次