web-dev-qa-db-ja.com

非同期およびコルーチンとタスクキュー

python 3でasyncioモジュールについて、さらに広くpythonでコルーチンについて読んでいますが、asyncioをこれほど優れたツールにしている理由がわかりません。コルーチンで実行できますが、マルチプロセッシングモジュール(セロリなど)に基づくタスクキューを使用することで、より適切に実行できます。コルーチンがタスクキューよりも優れているユースケースはありますか?

23
Mehdi GMIRA

適切な答えではありませんが、コメントに収まらないヒントのリスト:

  • あなたはmultiprocessingモジュールについて言及しています(そしてthreadingも考えてみましょう)。数百のソケットを処理する必要があるとします。数百のプロセスまたはスレッドを生成できますか?

  • 繰り返しますが、スレッドとプロセスの場合:共有リソースへの同時アクセスをどのように処理しますか?ロックのようなメカニズムのオーバーヘッドは何ですか?

  • Celeryのようなフレームワークも重要なオーバーヘッドを追加します。あなたはそれを使うことができますか?トラフィックの多いWebサーバーですべての単一のリクエストを処理するためですか?ちなみに、そのシナリオでは、ソケットと接続の処理を担当するのは誰ですか(Celeryの性質上、それを行うことはできません)。

  • 必ず読んでください asyncioの背後にある理論的根拠 。その理論的根拠は(とりわけ)システムコールに言及しています:writev()-複数のwrite() sよりもはるかに効率的ではありませんか?

21

上記の答えに追加:

手元のタスクがI/Oバウンドであり、共有データを操作する場合は、コルーチンと非同期がおそらく最適な方法です。

一方、データが共有されないCPUにバインドされたタスクがある場合は、Celeryのようなマルチプロセッシングシステムの方が適しています。

手元のタスクがCPUとI/Oの両方にバインドされており、データの共有が必要ない場合でも、Celeryを使用します。Celery内から非同期I/Oを使用できます。

CPUにバインドされたタスクがあるが、データを共有する必要がある場合、現在私が見ている唯一の実行可能なオプションは、共有データをデータベースに保存することです。 pyparallelのような最近の試みがありましたが、それらはまだ進行中です。

11
bhaskarc