2011-11-01 16 views
12

これを投稿する前に、mod_wsgi wikiを含む、かなりのリソースをオンラインで読んだことがありますが、Apacheのプロセス/スレッドがmod_wsgiとどのように対話するのか混乱しています。Apache + mod_wsgi interaction

Apacheは、1つ以上の子プロセスが着信要求を処理できるように設定でき、これらの子プロセスはそれぞれ、1つ以上のスレッドを使用して要求を処理するように構成できます。その後、物事は私のために濁って始まります。私の疑問は:

  1. WSGIDaemonProcessとは、Pythonのサブインタープリタを使って私のDjangoアプリを実際に呼び出している人ですか?
  2. 複数のスレッドが1つのApacheの子プロセスで許可されているモードでDjangoアプリケーションを実行していると、複数の要求が同時に同時にアプリケーションにアクセスする可能性がありますか?そうであれば、モジュールレベルの変数(ユーザーのIDの変数など)を設定するようなことは、他の並列要求によって上書きされ、非スレッドセーフな動作につながる可能性があります。
  3. 上記の場合、Pythonのグローバルインタプリタロックでは、スレッドは実際には並列に実行されますか?

答えて

10

各ポイントへの回答。

1 - WSGIDaemonProcess/WSGIProcessGroupは、WSGIアプリケーションを実行するためにmod_wsgiが別のプロセスをforkする必要があることを示しています。これはfork/execではないため、mod_wsgiは依然としてその制御を行います。 URLがデーモンモードで実行されているWSGIアプリケーションにマップされていることが検出されると、Apacheの子ワーカープロセス内のmod_wsgiコードはリクエストの詳細をデーモンモードプロセスにプロキシし、mod_wsgiコードがそれを読み取りWSGI応用。

2 - はい、複数のリクエストを同時に実行して、モジュールのグローバルデータを同時に変更したい場合があります。

3 - Pythonコードを一度に実行できるスレッドが1つしかないことを意味するグローバルインタプリタロックであるため、実行がPython自体の中にある場合はnoです。 Pythonインタープリタは、実行されているスレッドを定期的に切り替えます。スレッドの1つがCコードを呼び出してGILを解放した場合、スレッドがその状態になっている間、PythonまたはCコードで実行されている他のスレッドと並列に実行できます。例として、応答データを書き戻すためにApache/mod_wsgiレイヤーに呼び出しを行うと、GILが解放されます。これは、下位層で応答データを実際に書き戻しても、他のスレッドが実行されるのを妨げないことを意味します。

関連する問題