2016-09-28 9 views
2

私はCtrlキー+Cとジャンゴmanage.py runserverを終了すると、スレッドが適切にHTTPリクエスト仕上げを実行しているか、または、彼らは途中で中断されていますか?`manage.py runserver`とCtrl + C(ジャンゴ)

+0

私は、Ctrl + Cキーでプロセスとメインスレッドに関連するすべてのサブプロセスを終了させると思います。だから彼らは途中で中断されるだろう。 ps -eLf(linux、unix)を使用して、すべてのスレッドを二重確認の手段としてリストすることができます。 – reticentroot

答えて

3

TLは、DRは、HTTP要求が停止されている実行しているときにCtrlキー + Cはジャンゴのdevのサーバー

私はあなたの質問は本当に面白いと検討している考えにヒットされています。私が作った

ビューは実行に10秒かかり、その後は応答を送信します。 あなたの行動をテストするために、Ctrl + Cを使用して開発サーバーmanage.py runserverを停止し、結果を確認しました。

私のベースのテスト:

class TestView (generic.View): 
    def get (self, request): 
     import time 
     time.sleep(10) 
     response = HttpResponse('Done.') 
     return response 
  • ノーマル(10Sランタイム)を実行します。Done.
  • が実行中断MSGを表示します(はCtrl + C要求が実行されている間):ブラウザのエラーホストに到達できません。

これまでのすべてg期待どおりに。 、KeyboardInterrupt別名とすぐ + CがヒットするCtrlキーとして:PythonではCtrl +Cが完全に停止ではありませんが、実際にはかなり便利取り扱わので、しかし、私は、少し周りを演奏しました例外は(これに相当)を上昇さ:

raise KeyboardInterrupt() 

ので、あなたのコマンドラインベースのプログラムの開発に次を置くことができます。

try: 
    some_action_that_takes_a_while() 
except KeyboardInterrupt: 
    print('The user stopped the programm.') 

新しいビューはそのように見えますジャンゴに移植:

def get (self, request): 
    import time 
    slept_for = 0 
    try: 
     for i in range(100): 
      slept_for += 0.1 
      time.sleep(0.1) 
    except KeyboardInterrupt: 
     pass 

    response = HttpResponse('Slept for: ' + str(slept_for) + 's') 
    return response 
  • ノーマル(10Sランタイム)を実行は:MSGを表示Slept for: 10s
  • は要求しながら、(はCtrl + Cを実行中断しました実行中):ブラウザエラー、ホストにアクセスできない

変更なしここでの行動。興味のあるものは1行変更しましたが、結果は変わりませんでした。私は最終的にあなたの質問に答える代わりに

time.sleep(0.1) 

slept_for = 1000*1000 

を使用:Ctrlキー + Cのdevのサーバーはすぐにシャットダウンし、はHTTP-requetsを実行するには、完成しではありません

+2

デフォルトでは、 'manage.py runserver'はデーモンスレッドを使用して応答を送ります。つまり、メインスレッドが終了するとすぐに完全なプロセスがシャットダウンされ、デーモンスレッドが終了するのを待たないでしょう。 'KeyboardInterrupt'は応答を提供していないメインスレッドで起動されるので、あなたのビューでそれを取得することはできず、すべてのデーモンスレッドを持つプロセスは直ちに終了します。だからこそ、2番目の例ではまだ応答が完了しません。 – knbk

関連する問題