4

通常、Django アプリケーション レベルのプログラミング (ビューなど) で明示的にスレッドを使用する必要はありません。しかし、スレッドを介してサーバー側の分析を処理する興味深いライブラリに気付きました。

Django ビューでは、Python クライアントを使用して、別の (非デーモン) スレッドで HTTP POST を Web サービスにバッチ処理します。通常、スレッドではなく、このようなものにはRabbitMQを使用しますが、ライブラリの起動コストを下げたいと考えていました.

私の質問は、このアプローチに欠点はありますか? スレッドには追加のメモリ フットプリントがありますが、私はそれについてあまり心配していません。明らかに、開始されたリクエスト/スレッドの数に依存します。

スレッドがデーモンではなく、長時間実行される可能性があるという事実は問題ですか? Gunicorn プロセスが実行のメイン スレッドであり、無限ループで実行されると想定しているため、非デーモン スレッドが終了するまで待機する必要があるかどうかは一般的に問題ではありません。あれは正しいですか?

未解決の質問ですが、主なポイントは、Django/Gunicorn アプリにおける非デーモン スレッドの影響を理解することです。

4

1 に答える 1

7

Gunicorn はフォーク前のワーカー モデルを使用します。マスター プロセスは、ワーカー プロセスを生成して管理します。Tornado 以外の用途では、 Sync (デフォルト) とAsyncの 2 種類のワーカーがあります。

通常の操作では、これらのワーカーは、マスターがグレースフル シャットダウンを指示するか強制終了するまで、ループで実行されます。ワーカーは定期的にマスターにハートビートを発行して、まだ生きていて作業中であることを示します。ハートビートタイムアウトが発生した場合、マスターはワーカーを強制終了して再起動します。

したがって、ワーカーのメイン ループに干渉しないデーモン スレッドおよび非デーモン スレッドは影響を受けません。スレッドが作業を実行していて HTTP 応答に結果を提供するシナリオなど、スレッドがワーカーのメイン ループに干渉する場合は、非同期ワーカーの使用を検討してください。非同期ワーカーを使用すると、ワーカーがマスターにハートビートを発行できるようにしながら、TCP 接続を長時間存続させることができます。

于 2013-01-26T17:32:10.517 に答える