組み込み開発のための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計算を分けて計測し、どの部分が並行化の対象か説明できるようにしてください。