ThreadとQueueで並列処理をするのと、asyncioとはどちらが適しているか#1
| 登録日 | :2025/05/06 12:39 |
|---|---|
| カテゴリ | :Python基礎 |
例えば数百台のサーバがあり、psコマンドで各マシンで動作しているユーザとプロセス(ソフト)の情報をSSH経由で取得するプログラムを検討しています。この場合、ThreadとQueueで並列処理をするのと、asyncioとはどちらが適していますか?
数百台のサーバーからSSH経由で情報を取得する場合、asyncioが最適です。理由は以下の通りです
-
具体的な推奨理由
高並行性への対応
asyncioは1スレッド内で数百のSSH接続を同時に処理できます。asyncsshライブラリを使用すれば、非同期SSHセッションを簡単に実装可能です。 -
軽量なリソース使用
スレッドと異なり、コルーチンはメモリ使用量が極めて少ないため、数百台規模の処理でも安定動作します。 -
ブロッキングの回避
asyncsshは非同期I/Oをネイティブサポートしており、ネットワーク待機中に他のタスクを実行できます。 -
エラーハンドリングの容易性
単一スレッドでタスクを管理するため、デバッグや例外処理がスレッドよりもシンプルです。
実装例
import asyncio
import asyncssh
async def fetch_process_info(host, user, password):
async with asyncssh.connect(host, username=user, password=password) as conn:
result = await conn.run("ps aux")
return f"{host}:\n{result.stdout}"
async def main():
hosts = [...] # 数百台のホスト情報
tasks = [fetch_process_info(h['ip'], h['user'], h['pass']) for h in hosts]
results = await asyncio.gather(*tasks)
for res in results:
print(res)
asyncio.run(main())
Threadが適するケース
非同期対応ライブラリが存在しない場合
CPUバウンドな処理が混在する場合(※ただしmultiprocessingがより適切)
結論: 大規模なSSH並列処理ではasyncio + asyncsshが最適です。スレッドよりもリソース効率が高く、コードも簡潔に保てます。