2016-09-28 101 views
2

當我退出Django的manage.py runserver按Ctrl +Ç,也正在運行的線程的HTTP請求完成正確或者他們在中途中斷?`manage.py runserver`和Ctrl + C(Django的)

+0

我認爲Ctrl + C殺死了與主線程相關的進程和所有子進程。所以他們會在中間被打斷。您可以使用ps -eLf(linux,unix)列出所有線程作爲雙重確認的手段。 – reticentroot

回答

3

TL; DR運行HTTP請求停止時按Ctrl + Ç被擊中的Django開發服務器

我覺得你的問題是真的很有趣,研究了:

我做了一個視圖需要10秒鐘才能執行,然後發送響應。 要測試您的行爲,我停止了開發服務器manage.py runserver使用Ctrl + C並檢查結果。

我的基本測試:

class TestView (generic.View): 
    def get (self, request): 
     import time 
     time.sleep(10) 
     response = HttpResponse('Done.') 
     return response 
  • 正常執行(10S運行時):顯示MSG Done.
  • 中斷執行(Ctrl鍵 + Ç請求正在運行時):瀏覽器誤差,主機無法聯繫到

到目前爲止everythin如預期的那樣。但我打得四處一點點,因爲按Ctrl + Ç在巨蟒不是一個句號,但實際處理而方便:只要按Ctrl + Ç被擊中,一個KeyboardInterrupt又名的例外的是上升(相當於本):

raise KeyboardInterrupt() 

所以在您的基於命令行的PROGRAMM你可以把以下內容:

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

移植到DJANGO新視圖看起來像這樣:

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鍵 + Ç而請求正在運行):瀏覽器錯誤,無法訪問主機

所以沒有改變在這裏的行爲。出於興趣,我改變了一行,但結果沒有改變;我用

slept_for = 1000*1000 

,而不是

time.sleep(0.1) 

所以最後回答你的問題:在按Ctrl + ç開發服務器立即關閉正在運行的HTTP requets沒有完成

+2

默認情況下,'manage.py runserver'使用守護線程來提供響應,這意味着一旦主線程完成,整個進程就會關閉,並且不會等待任何守護線程完成。由於在主線程中觸發了'KeyboardInterrupt',它沒有提供任何響應,所以無法在視圖中捕獲它,並且所有守護進程線程都立即退出。這就是爲什麼你的第二個例子仍然沒有完成迴應。 – knbk

相關問題