python 3でasyncioモジュールについて、さらに広くpythonでコルーチンについて読んでいますが、asyncioをこれほど優れたツールにしている理由がわかりません。コルーチンで実行できますが、マルチプロセッシングモジュール(セロリなど)に基づくタスクキューを使用することで、より適切に実行できます。コルーチンがタスクキューよりも優れているユースケースはありますか?
適切な答えではありませんが、コメントに収まらないヒントのリスト:
あなたはmultiprocessing
モジュールについて言及しています(そしてthreading
も考えてみましょう)。数百のソケットを処理する必要があるとします。数百のプロセスまたはスレッドを生成できますか?
繰り返しますが、スレッドとプロセスの場合:共有リソースへの同時アクセスをどのように処理しますか?ロックのようなメカニズムのオーバーヘッドは何ですか?
Celeryのようなフレームワークも重要なオーバーヘッドを追加します。あなたはそれを使うことができますか?トラフィックの多いWebサーバーですべての単一のリクエストを処理するためですか?ちなみに、そのシナリオでは、ソケットと接続の処理を担当するのは誰ですか(Celeryの性質上、それを行うことはできません)。
必ず読んでください asyncioの背後にある理論的根拠 。その理論的根拠は(とりわけ)システムコールに言及しています:writev()
-複数のwrite()
sよりもはるかに効率的ではありませんか?
上記の答えに追加:
手元のタスクがI/Oバウンドであり、共有データを操作する場合は、コルーチンと非同期がおそらく最適な方法です。
一方、データが共有されないCPUにバインドされたタスクがある場合は、Celeryのようなマルチプロセッシングシステムの方が適しています。
手元のタスクがCPUとI/Oの両方にバインドされており、データの共有が必要ない場合でも、Celeryを使用します。Celery内から非同期I/Oを使用できます。
CPUにバインドされたタスクがあるが、データを共有する必要がある場合、現在私が見ている唯一の実行可能なオプションは、共有データをデータベースに保存することです。 pyparallel
のような最近の試みがありましたが、それらはまだ進行中です。