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バウンドな操作、特にネットワーク通信やデータベース操作などで真価を発揮します。
コメント