2012-09-26 14 views
11

Webサーバーは、同時に多くの要求を処理する必要があります。 Pythonインタプリタは実際にGIL制約を持っているので、並行処理はどのように実装されていますか?python WebサーバーはGILをどのように克服しますか

複数のプロセスを使用し、状態共有にIPCを使用していますか?

+4

どのような状態共有ですか? Webリクエストの要点は、それぞれが独立していることです。共有された状態はありません。 –

答えて

2

通常通り。 WebサービスはほとんどI/Oバウンドであり、GILはI/O操作中に解放されます。したがって、特別な調整なしでスレッド化が使用されるか、イベントループ(Twistedなど)が使用されます。

+1

私は待っている/受け取り要求について話していません。私はそれらを扱うことを話している。たとえば、リクエストを受け取った場合、POSTやGETのさまざまなリクエスト(通常はPythonコードとして書かれている)をチェックするなどの処理が必要な場合があります。だから、Pythonインタプリタは、GILの制約があるので、これらのコードブロックを同時にどのように実行するのでしょうか。 –

+2

これは単に真実ではありません。すべてのワークロードがIOバウンドであるとは限りません。最大限のCPUを備えたWebサーバーを見ることは、まったく共通しています。実行されているアプリケーションによって異なります。 – usr

1

あなたは通常、独立した要求で派遣される多くの労働者(すなわち、ガンコン)を雇っています。他のすべて(並行性に関連する)はデータベースによって処理されるので、あなたから抽象化されます。すべての

あなたはIPCを必要としない、あなただけなど、RDBMS、キャッシュサーバ(Redisの、memcachedの)される、「真実の単一ソース」が必要

1

まず、要求が可能独立して処理されます。しかし、サーバはに同時にを処理したいので、最大時間で処理できる要求の数を維持する必要があります。

というコンセプトの実装は、同時実行性はWebサーバーによって異なります。

一部の実装では、要求を処理するスレッドまたはプロセスの数が固定されている場合があります。すべてが使用中の場合、追加の要求は処理されるまで待たなければなりません。

また、要求ごとにプロセスまたはスレッドが生成される可能性があります。要求ごとにプロセスを生成すると、不合理なメモリとCPUオーバーヘッドが発生します。軽量スレッドを生成するほうが優れています。そうすることで、毎秒何百ものクライアントにサービスを提供することができます。しかし、スレッドも管理上のオーバーヘッドをもたらし、高いメモリとCPU消費量に現れます。

非同期コルーチンに基づくイベントドリブンアーキテクチャは、何千ものクライアントにサービスを提供するために最先端のソリューションです。これにより、サーバーは数多くのスレッドを生成することなく、高速でクライアントにサービスを提供できます。 Wikipedia page of the so-called C10k problemには、Webサーバーのリストがあります。その中で、多くはこのアーキテクチャを利用しています。

コルーチンはPythonでも利用できます。 http://www.gevent.org/を見てください。そのため、たとえばuWSGI + geventに基づくPython WSGIアプリケーションは、非常に優れたソリューションです。

+0

"要求ごとにプロセスを起動すると、不合理なメモリとCPUオーバーヘッドになります。"これはOSに完全に依存します。 –

+0

@ IgnacioVazquez-Abrams:どのOSがこれに当てはまらないのですか(「不条理」はスレッディングやコルーチンのオーバーヘッドと比較して意味されました)? –

+0

それは本当ではない、それは "ばかげた"の正確な定義が異なるということではない。 Windowsは、新しいプロセスを開始する場合には、祝福された排泄物の大きな蒸し木ですが、比較するとかなり軽い傾向があります。 –

関連する問題