私はPythonのログハンドラを持っています ログエントリごとに新しいスレッドを生成します。そして、新しいスレッド内でログは別のサーバーに送信されます。しかし、リクエストが断続的にタイムアウトすることに気付きました。ハンドラを無効にすると、問題は解決します。
他のWSGIサーバー(WSGIUtils、WSGIRef)を試しましたが、再現できません。
何か案は?
私は同期ワーカーとDebian上のDjango 1.6でGunicorn 19.3を実行しています。
回答:
回答№1は0これはGILのもう1つのケース、Global Interpreter Lockです。これが起こると仮定します。
- リクエストが入ってくる
- 労働者は始まる
- ワーカーログ - >スレッドが開始されました
- 労働者は終わった
- 応答が送信されました
- スレッドログイベント
よさそうだね。しかし、スレッドの処理速度が上がるとどうなりますか?それからあなたは得る:
- リクエストが入ってくる
- 労働者は始まる
- ワーカーログ - >スレッドが開始されました
- 労働者は終わった
- スレッドログイベント
- 応答が送信されました
スレッドがどのロックを保持しているかによってどのOS機能を呼び出すかによって、スレッドはしばらくの間GILを解放しない可能性があり、それによってワーカーがブロックされるか、少なくとも応答が完全に配信されるのが妨げられる可能性があります。
コードを見ると、ログメッセージごとにSSL接続を作成していることがわかります。SSLは非常に重要です。 非常に 高価な。しないでください。 代わりに、SSLソケットを一度開いてそれを開いたままにするワーカースレッドを作成します。他のコードが機能するように、ソケットに書き込むときにPythonライブラリはGILを解放するべきです。しかし、ソケットを開いたときにPythonがロックを解除するかどうかはわかりません。