6

PythonRubyにはインタープリター スレッドごとに 1 つのカーネル スレッドがありますが、潜在的に共有されるデータ構造を保護するために使用されるグローバル インタープリター ロック (GIL) があるため、マルチプロセッサーの実行が抑制されます。C または C++ で記述された言語の部分はフリー スレッド化できますが、複数のプロセスを使用しない限り、純粋に解釈されたコードでは不可能です。これを達成するための最良の方法は何ですか?FastCGI を使用していますか? 仮想化されたサーバーのクラスターまたはファームを作成しますか? 同等の Java である JRuby と Jython を使用していますか?

4

5 に答える 5

4

どの問題を解決したいのか完全にはわかりませんが、mod_python apache を使用して apache prefork MPM を介して python/django アプリケーションをデプロイすると、apache はさまざまな要求を処理するためにいくつかのワーカー プロセスを開始します。

1 つのリクエストが非常に多くのリソースを必要とし、複数のコアを使用したい場合は、pyprocessingをご覧ください。しかし、それは賢明ではないと思います。

于 2008-08-31T21:53:30.797 に答える
4

Rails でこれを行う「標準的な」方法は、Mongrel インスタンスの「パック」(つまり、Rails アプリケーションの 4 つのコピー) を実行してから、apache や nginx、またはその他のソフトウェアを使用してそれらの前に座って動作することです。ロードバランサーとして。

これはおそらく、merb などの他の Ruby フレームワークで行われている方法ですが、私はそれらを個人的に使用したことはありません。

OS は、それぞれの mongrel を独自の CPU で実行します。

mod_rails aka Phusion Passengerをインストールすると、Rails プロセスの複数のコピーも開始および停止されるため、同様の方法で複数の CPU/コアに負荷が分散されます。

于 2008-08-31T22:41:55.827 に答える
1

mod_wsgiPythonなど、個別のインタープリターで各応答を実行するインターフェイスを使用します。これにより、GIL に遭遇することなくマルチスレッドを使用できます。

編集:どうやら、mod_wsgiばかが拡張モジュールを適切に実装する方法を理解できなかったため、プロセスごとに複数のインタープリターをサポートしなくなったようです。ただし、FastCGI スタイルの個別のプロセスでのリクエストの実行は引き続きサポートされているため、現在受け入れられているソリューションであることは明らかです。

于 2008-08-31T21:43:58.480 に答える
1

Python と Ruby では、複数のコアを使用することのみが可能であり、新しい (重い) プロセスを生成することです。Java 版は、Java プラットフォームの可能性を継承しています。Java スレッドを使用することをほのめかすことができます。たとえば、Glassfish のような Java Application Server が Ruby on Rails アプリケーションに使用されることがある (多くの場合) のはそのためです。

于 2008-10-10T07:18:15.943 に答える
0

Python の場合、PyProcessingプロジェクトを使用すると、スレッドを使用するのと同じようにプロセスを使用してプログラミングできます。最近リリースされた 2.6 バージョンの標準ライブラリに として含まれていmultiprocessingます。このモジュールには、共有データ構造 (キュー、パイプなど) へのアクセスを確立および制御するための多くの機能と、一般的なイディオム (つまり、マネージャーとワーカー プール) のサポートがあります。

于 2008-10-10T13:24:31.713 に答える