Pythonでの非同期処理の基本とその応用例

Pythonにおける非同期処理の基本について解説します。この記事では、非同期処理の基礎から、実用的な応用例までを詳しく説明します。具体的なコード例とその解説、応用例も含めています。

目次

はじめに

非同期処理は、プログラムが複数のタスクをほぼ同時に処理する技術の一つです。Pythonでは`asyncio`ライブラリを使って非同期処理を実現できます。

非同期処理の基本

非同期処理の要は、`async`と`await`キーワードです。これらを使うことで、処理を非同期にすることが可能です。

基本的な書き方

import asyncio

async def main():
    print('Hello')
    await asyncio.sleep(1)
    print('World')

asyncio.run(main())

この例では、`main`関数内で`await asyncio.sleep(1)`が呼ばれると、1秒間プログラムが停止しますが、その間に他のタスクが実行できます。

タスクの並行実行

import asyncio

async def task1():
    print('Task1 started')
    await asyncio.sleep(2)
    print('Task1 completed')

async def task2():
    print('Task2 started')
    await asyncio.sleep(1)
    print('Task2 completed')

async def main():
    await asyncio.gather(task1(), task2())

asyncio.run(main())

この例では、`task1`と`task2`がほぼ同時に実行されます。`asyncio.gather()`を使うことで、複数の非同期タスクを並行して実行できます。

応用例

非同期でのHTTPリクエスト

import aiohttp
import asyncio

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

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://example.com')
        print(html)

asyncio.run(main())

非同期のデータベース操作

import asyncio
import aiosqlite

async def database_query():
    async with aiosqlite.connect('database.db') as db:
        async with db.cursor() as cursor:
            await cursor.execute('SELECT * FROM table_name')
            rows = await cursor.fetchall()
            for row in rows:
                print(row)

asyncio.run(database_query())

非同期でのファイル操作

import aiofiles

async def read_file():
    async with aiofiles.open('file.txt', mode='r') as f:
        contents = await f.read()
        print(contents)

asyncio.run(read_file())

まとめ

この記事で説明した基本的な非同期処理とその応用例を理解し、実装できれば、より効率的なプログラムを作成できるでしょう。非同期処理は、I/Oバウンドな操作、特にネットワーク通信やデータベース操作などで真価を発揮します。

コメント

コメントする

目次