2016-09-15 6 views
0

リクエストハンドラを呼び出すスレッド(プロセス)を起動/制御するWebサーバですか?または、Django自体に非同期/マルチスレッドアーキテクチャがありますか?問題は、(ajax)リクエストが長時間処理されているときに、このクライアントの再送信中に以前のハンドラが終了した場合です。私はこれをいくつかコントロールしたいと思います。いくつかのクリーンアップアクションを実行します。場合によってはハンドラを手動で終了することもできます。Djangoハンドラのスレッドを管理する

答えて

1

DjangoはWebサーバではない、それはWebフレームワークですので、あなたが言ったように確かに、それは、着信要求を処理するためのスレッドを生成しますが、それは受け入れ、最終的にの[HTTP(S)]の要求に応答するためのWebサーバの仕事ですユーザー。

あなたが直面しているのは、おそらく計算に時間がかかり、Webサーバー(おそらくnginxまたはapache)が要求をタイムアウトすることです。タイムアウトを防ぐには、Webサーバーのタイムアウト設定を増やす必要があります。この人はほとんどように、gunicornの同類を使用uwsgimod_wsgiをとするために

はまた、Djangoは仕事を得るために、あなたは、WSGIを理解コネクタを必要としています。タイムアウトまで長い値を受け入れるように設定する必要もあります。

たとえば、Nginx/Gunicornを使用している場合は、this questionを参照して、タイムアウトの設定方法を確認してください。

最後に、最後のメモとして、リクエストで大量の計算を行っている場合、ユーザーのリクエストをブロックしてバックグラウンドで実行しないほうがよいでしょう。 Celeryは、この状況で見ると非常に便利なツールです。

巨大な計算でない場合は、単にタイムアウト値を大きくすることができます。しかし、計算時間が長くかかる、例えば45秒以上かかる場合は、セラーリーとバックグラウンド処理のリクエストを使用して、やり方を変えたり、ソリューションを実装する方がよいでしょう。

編集。

スレッドを正確に処理していることと裏で何が起こっているのかを知りたい場合は、Gunicornについてthis postingと読んでみることをおすすめします。また、それを読む前にdesign page of Gunicornで読むのも良いです。基本的に、WSGIプログラムとWebServerの両方が、タイムアウトの場合にスレッドを強制終了します。

djangoスレッドのタイムアウトが早ければ(gunicornタイムアウト)、WSGIプログラムはスレッドを強制終了します。一方、gunicornのタイムアウトがNginxのタイムアウトよりも長く設定されている場合、Nginxはスレッドを強制終了します。

+0

ご清聴ありがとうございます。私のデータ検索は長く、セロリーを使用する途中です。しかし、私はまだ質問に興味があります。 2人のWHOがスレッドを殺す責任がありますか? (重複した要求が受け取られたとき、前のものが計算されている間、私が見るもの)。 CAN他の方法でこの動作に正当な影響を与え、サーバーのタイムアウトを変更したり、必要に応じて強制的にスレッド終了を強制できますか? – VladimirLenin

+1

@VladimirLenin私の答えを更新しました。 – SpiXel