2016-09-28 129 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

相关问题