KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

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が最適です。スレッドよりもリソース効率が高く、コードも簡潔に保てます。