2012-06-09 12 views
7

私はトルネードがシングルスレッドの非ブロッキングサーバーだと理解しています。したがって、要求は順次処理されます(IO操作のイベント駆動アプローチを使用する場合を除く)。竜巻で並行処理が可能ですか?

通常(非IO)実行のために複数の要求を並列に処理する方法がありますか?私は複数のプロセスをフォークすることはできません。なぜなら、要求全体に共通のメモリスペースが必要なためです。

もし私が他のパイソンサーバーがパラレルリクエストを処理でき、wsgiもサポートしているのであれば教えてください。

答えて

7

コンピューティングバウンドの複数の同時リクエストを処理していて、Pythonで実行したい場合は、マルチスレッドではなくマルチプロセスサーバーが必要です。 CPythonには、複数のスレッドが同時にPythonバイトコードを実行するのを防ぐグローバルインタープリタロック(GIL)があります。

ほとんどのWebアプリケーションでは、データベースやディスク、または他のサーバーのサービスからI/Oを待っています。 Tornadoを破棄する前に、計算上の要求を処理する必要があることを確認してください。

5

これらの計算処理スレッドが実行される時間は、実際にどのくらいの期間実行されるかによって異なります。彼らが短期間で走っていて、少なくとも処理速度が彼らの到着率と一致すれば、Tornadoは問題ありません。これは本当にシングルスレッドですが、スケールが非常によくなります。

コンピューティングバインドされたリクエストが長時間実行されている場合、Ned Batchelderが既に指摘したように、GILはボトルネックになるため、スレッドサーバーを使用すると必ずしも役に立ちません。

すべてのリクエストで同じメモリスペースを使用できるという制限を緩和できるのであれば、複数のTornadoバックエンドを実行し、1つのTornadoインスタンスに面する方法を提供するため、PyZMQでTornadoを実行することを検討することができます。これにより、ソリューション全体に対してTornadoを引き続き使用することができます。詳細については、PyZMQのweb.zmqwebモジュールを参照してください。

+0

返信いただきありがとうございます。私はGILを知らない。ですから、私はCPythonでスレッドを使用して並列処理を行うことはできません。マルチプロセスに移行する必要があります。 – Adhi

+1

Pythonで並列処理を行うことはできますが、Pythonコードを実行するときに1 CPU pr Pythonプロセスのみを使用するため、すべてのリソースを利用することはありません。したがって、スレッドを並行処理に使用できますが、利用可能なパフォーマンスの向上には一定の制限があります。しかし、多くの場合、TornadoはI/Oを待つことになるので、例えばスレッディングを追加することで十分に得られるはずです。 –

+0

zmqwebはPyZMQから独自のプロジェクトに引き抜かれました:https://github.com/ellisonbg/zmqweb –

関連する問題