Pythonのasync/await構文の基本と応用

この記事では、Pythonで使用される`async/await`構文の基本から応用までを詳しく解説します。具体的なコード例とその解説、応用例を含めています。

目次

async/await構文の基本

`async/await`はPython 3.5以降で利用可能な非同期処理を行うための構文です。非同期処理とは、一つのタスクが完了するのを待つことなく、他のタスクを並行して実行する方法です。

async defによる関数定義

非同期関数を定義するには、通常の`def`キーワードの前に`async`を付けます。

# 非同期関数の定義
async def my_function():
  print("Hello, async!")

awaitによる非同期処理の待機

`await`キーワードは非同期関数内でのみ使用可能で、非同期処理の結果を待ちます。

# awaitの使用例
async def my_function():
  print("Hello, async!")
  await asyncio.sleep(1)  # 1秒間スリープ
  print("Done!")

asyncio.runでの実行

Python 3.7以上では、`asyncio.run()`を使って非同期関数を呼び出すことができます。

# asyncio.runで非同期関数を実行
import asyncio

async def main():
  await my_function()

asyncio.run(main())

応用例1:複数の非同期処理

一つの非同期関数が処理中でも、他の非同期関数を実行することができます。以下はその一例です。

# 複数の非同期関数を同時に実行
import asyncio

async def task_one():
  print("Task one start")
  await asyncio.sleep(2)
  print("Task one done")

async def task_two():
  print("Task two start")
  await asyncio.sleep(1)
  print("Task two done")

async def main():
  await asyncio.gather(task_one(), task_two())

asyncio.run(main())

応用例2:非同期I/O処理

`async/await`は非同期I/O処理、特にネットワーク通信にも使われます。

# aiohttpを使用した非同期HTTPリクエスト
import aiohttp
import asyncio

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

async def main():
  html = await fetch('http://example.com')
  print(html)

asyncio.run(main())

まとめ

`async/await`構文は非同期処理において非常に便利なツールです。基本的な非同期関数の定義から、複数の非同期処理の管理、非同期I/O処理まで幅広く使えます。この機能を理解して活用することで、より効率的なプログラムを書くことが可能です。

コメント

コメントする

目次