當我退出Django的manage.py runserver
與按Ctrl +Ç,也正在運行的線程的HTTP請求完成正確或者他們在中途中斷?`manage.py runserver`和Ctrl + C(Django的)
2
A
回答
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
相關問題
- 1. python3 manage.py runserver
- 2. 蟒蛇./store/manage.py RUNSERVER
- 3. PyCharm manage.py runserver錯誤
- 4. manage.py runserver命令
- 5. manage.py runserver命令失敗
- 6. 無法運行「python manage.py runserver」
- 7. Django /manage.py runserver不起作用(Windows)
- 8. Django:'python manage.py runserver'給出「Segmentation fault」錯誤
- 9. 在Jython上使用Django管理manage.py runserver
- 10. Django manage.py runserver無法打開瀏覽器
- 11. Django manage.py runserver不顯示「歡迎頁面」
- 12. python manage.py runserver分割錯誤
- 13. manage.py runserver錯誤:[Errno 10013]
- 14. Django和Python的manage.py runserver命令執行錯誤
- 15. 執行python manage.py runserver時出錯
- 16. 蟒蛇manage.py runserver命令失敗
- 17. 蟒蛇manage.py runserver命令錯誤django.core.exceptions.ImproperlyConfigured:T
- 18. 瞭解django-admin runserver和mange.py runserver之間的區別
- 19. 當我運行manage.py時,Python.exe崩潰runserver
- 20. $ manage.py runserver/system/bin/sh:manage.py:找不到
- 21. 可以manage.py runserver執行npm腳本嗎?
- 22. 運行manage.py後保持PowerShell打開runserver
- 23. manage.py runserver不能正常工作
- 24. manage.py runserver命令不會終止
- 25. Django的manage.py測試無法看到urls.py,雖然能的runserver
- 26. Django:Override Debug = True from manage.py runserver命令
- 27. 通過python manage.py runserver將django部署到VPS上的產品
- 28. IndentationError運行manage.py runserver命令Django的時候
- 29. 做PY -3.5 manage.py runserver命令時,語法錯誤的Django(1.10.1)
- 30. 的Django的runserver找不到Django的
我認爲Ctrl + C殺死了與主線程相關的進程和所有子進程。所以他們會在中間被打斷。您可以使用ps -eLf(linux,unix)列出所有線程作爲雙重確認的手段。 – reticentroot