組み込み開発のためのPython · レッスン 217 / 220

asyncio・スレッド・プロセスの選び方

待ち時間の重なる処理とCPU処理を区別し、適切な並行方式を選びます。

複数機器を待つ処理には並行化が役立つことがありますが、非同期構文を使えば必ず速くなるわけではありません。処理が待ち時間主体かCPU主体かを測ってから選びます。

待ち時間主体なら非同期を検討する

`asyncio`は対応した非同期I/Oを協調的に進めます。ブロッキング関数をそのままイベントループで呼ぶと、他の処理まで止まります。利用ライブラリが非同期に対応しているか、タイムアウトやキャンセルをどう扱うかを確認します。

共有状態と安全停止を考慮する

スレッドはブロッキングI/Oの並行化に使えますが、共有データの同時変更に注意が必要です。CPUを多く使う処理は、プロセス分割や最適化を検討します。どの方式でも、停止要求を受けたときに資源を解放し、安全状態へ戻れる経路を設計します。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

import asyncio

async def inspect_device(name: str) -> str:
    await asyncio.sleep(0.1)  # 非同期I/Oを待つ位置の例
    return f"{name}: ready"

async def main() -> None:
    results = await asyncio.gather(
        inspect_device("fixture-A"),
        inspect_device("fixture-B"),
    )
    for result in results:
        print(result)

asyncio.run(main())

手を動かす課題

疑似I/O待ちとCPU計算を分けて計測し、どの部分が並行化の対象か説明できるようにしてください。

参考資料

「8. 非同期処理・依存関係・運用」の章一覧へ