2016-09-28 3 views
2

Когда я бросить Django manage.py runserver с Ctrl + C, не работает нити HTTP закончить запрос правильно или они прерваны в середине?`manage.py runserver` и Ctrl + C (Джанго)

+0

Я считаю, что Ctrl + C убивает процесс и все подпроцессы, связанные с основным потоком. Поэтому они будут прерваны посередине. Вы можете, вероятно, использовать ps -eLf (linux, unix), чтобы перечислить все потоки как средство двойного подтверждения. – reticentroot

ответ

3

TL; DR работает HTTP запросы будут остановлены, когда Ctrl + C ударил на Джанго Dev сервере

Я думал, что ваш вопрос действительно интересен и исследован:

Я сделал который занимает 10 секунд, и после этого отправляет ответ. Чтобы проверить ваше поведение, я остановил сервер разработки manage.py runserver, используя Ctrl + C и проверял результаты.

Моя база тест:

class TestView (generic.View): 
    def get (self, request): 
     import time 
     time.sleep(10) 
     response = HttpResponse('Done.') 
     return response 
  • Нормальный Execute (10s во время выполнения): Отображает Сообщ Done.
  • прервал выполнение (Ctrl + C пока запрос работает): Ошибка браузера , хозяин не может быть достигнут

до сих пор каждый г, как ожидалось. Но я играл немного, потому что Ctrl + C в питоне не полная остановка, но на самом деле обрабатывается довольно удобно: Как только Ctrl + C будет хитом, KeyboardInterrupt аки Исключение воскресе (эквивалент этого):

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 
  • Normal выполнить (10s выполнения): Отображает Сообщ Slept for: 10s
  • прервал выполнение (Ctrl + C в то время как запрос) Ошибка браузера, хост не может быть достигнут

поэтому никаких изменений в поведении здесь.из интереса я изменил одну строку, но результат не изменился; я использовал

slept_for = 1000*1000 

вместо

time.sleep(0.1) 

так, чтобы, наконец, ответить на ваш вопрос: на Ctrl + C сервер DEV немедленно отключается и работает HTTP-requets является не законченного.

+2

По умолчанию «manage.py runningerver» использует потоки демона для ответа на запросы, а это означает, что полный процесс завершается, как только заканчивается основной поток, и он не будет ждать окончания нитей демона. Поскольку 'KeyboardInterrupt' запускается в основном потоке, который не обслуживает никаких ответов, вы не можете его захватить в своем представлении, и процесс со всеми потоками демонов немедленно прекращается. Вот почему ваш второй пример до сих пор не завершает ответ. – knbk

Смежные вопросы