【Python入門】asyncioとは?非同期処理をやさしく解説!

Python

Pythonでプログラムを書いていると、たまに見かけるのがこの一文です。

import asyncio

「見たことはあるけど何をしているものなのか分からない…」
「スレッドとか並列処理とか難しそう…」

そんな方でも この記事を読めば「asyncioの基本」が分かります

この記事で分かること

  • asyncioとは?
  • async / await の基本
  • asyncio.run() の役割
スポンサーリンク
スポンサーリンク

asyncioとは?

asyncioPython標準ライブラリ で、
非同期処理(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
メリット通信処理・センサー処理などが速くなる

Pythonでつくるデスクトップアプリ

非同期処理はアプリ開発に必要な知識です。アプリ開発に挑戦したい方におすすめの書籍です。

おまけ:次に学ぶと良いこと

テーマ内容
asyncio.gather() の応用さらに多くの処理を同時実行
asyncio.Queue並行処理でデータを安全に受け渡す
Bleak + asyncioBluetoothデバイスとの通信に役立つ
タイトルとURLをコピーしました