Pythonでプログラムを書いていると、たまに見かけるのがこの一文です。
import asyncio
「見たことはあるけど何をしているものなのか分からない…」
「スレッドとか並列処理とか難しそう…」
そんな方でも この記事を読めば「asyncioの基本」が分かります!
この記事で分かること
asyncioとは?
asyncioは Python標準ライブラリ で、
「非同期処理(asynchronous programming)」を実現するためのモジュールです。
非同期処理って何?
普通の処理(同期処理)は、1つずつ順番に実行します。
A → B → C(終わるまで次に進まない)
非同期処理では、
A → 同時に B や C も進む → 結果が揃ったらまとめて処理
となり、複数の処理を同時に進めることができます。
なぜ非同期処理が必要?
例えばこのような処理があります:
- Web API からデータを取得する
- ネットワーク通信をする
- Bluetooth / センサーからのデータ取得
- ファイルダウンロード etc.
これらは “待ち時間” が発生します。
もし待ち時間の間に他のことができたら効率的ですよね?
そこで asyncio を使います。
基本の構文:async と await
非同期関数の定義
async def hello():
print("こんにちは")
非同期処理の実行
非同期処理を呼び出すときは await を使います。
async def main():
await hello()
実行は asyncio.run()
import asyncio
asyncio.run(main())
実例:1秒待つ処理を2つ同時に実行
同期処理(普通の書き方)
import time
start = time.perf_counter() #計測開始
def task(name):
time.sleep(1)
print(f"{name} 完了")
task("A")
task("B")
end = time.perf_counter() #計測終了
print('{:.2f}'.format((end-start)))
実行時間 → 約2秒
非同期処理(asyncio)
import asyncio
import time
start = time.perf_counter() #計測開始
async def task(name):
await asyncio.sleep(1)
print(f"{name} 完了")
async def main():
await asyncio.gather(
task("A"),
task("B")
)
asyncio.run(main())
end = time.perf_counter() #計測終了
print('{:.2f}'.format((end-start)))
実行時間 → 約1秒
同時に実行されたので速い!
asyncio.sleep() がよく使われる理由
time.sleep() は 完全に停止 してしまうため非同期と相性が悪いです。
一方 asyncio.sleep() は「待ち時間にメイン処理を譲る」ため、他の処理が並行できます。
まとめ
| 項目 | 内容 |
|---|---|
asyncio とは | Pythonの非同期処理用ライブラリ |
| 非同期処理の目的 | 待ち時間を有効活用して処理を高速化する |
| 重要なキーワード | async, await, asyncio.run(), asyncio.gather |
| メリット | 通信処理・センサー処理などが速くなる |
おまけ:次に学ぶと良いこと
| テーマ | 内容 |
|---|---|
asyncio.gather() の応用 | さらに多くの処理を同時実行 |
asyncio.Queue | 並行処理でデータを安全に受け渡す |
Bleak + asyncio | Bluetoothデバイスとの通信に役立つ |
