1. ホーム
  2. python

[解決済み] グリーンレットVSスレッド

2022-05-10 18:06:38

質問

私はgeventsとgreenletsの初心者です。しかし、いつ、どのようにグリーンレッツを使うべきか、正当な理由を教えてくれるものはありませんでした。

  • それらは本当に何が得意なのですか?
  • プロキシサーバで使用するのは良いアイデアですか、そうではありませんか?
  • なぜスレッドではないのですか?

私がよくわからないのは、基本的に共同ルーチンである場合、それらがどのように私たちに並行性を提供することができるのかということです。

どのように解決するのですか?

グリーンレットは並行処理を提供しますが ではなく 並列性ではありません。同時実行とは、コードが他のコードから独立して実行できることです。並行処理とは、同時進行するコードを同時に実行することです。並列処理は、ユーザー空間で多くの作業を行う場合に特に有効で、通常は CPU の負荷が高くなります。並行処理は、問題を分解し、異なる部分をより簡単に並行してスケジュールおよび管理できるようにするのに便利です。

グリーンレットは、1つのソケットとのインタラクションが他のソケットとのインタラクションから独立して発生することができるネットワークプログラミングで本当に輝きます。これは並行処理の典型的な例です。各グリーンレットはそれ自身のコンテキストで実行されるので、スレッドなしで同期APIを使用し続けることができます。スレッドは仮想メモリとカーネルオーバーヘッドの点で非常に高価なので、スレッドで実現できる同時実行性は著しく低いので、これは良いことです。さらに、PythonのスレッドはGILのために通常よりも高価で、より制限されています。同時実行の代替案は通常、Twisted、libevent、libuv、node.js などのプロジェクトで、すべてのコードが同じ実行コンテキストを共有し、イベントハンドラを登録するようなものです。

リクエストの処理は独立して実行することができ、そのように書かれるべきなので、プロキシを書くためにグリーンレット(geventのような適切なネットワークサポート付き)を使用することは素晴らしいアイデアです。

グリーンレットは、私が先にあげた理由で並行処理を提供します。並行処理とは、並列処理ではありません。イベント登録を隠し、通常は現在のスレッドをブロックする呼び出しであなたのためにスケジューリングを実行することによって、gevent のようなプロジェクトは、非同期 API への変更を必要とせず、システムに対してかなり少ないコストでこの同時実行性を公開します。