Авто-терминация долгосрочных запросов в Джанго - PullRequest
5 голосов
/ 11 октября 2011

У меня есть установка с Apache + mod_wsgi, выполняющая код django, и я хотел бы добавить слой защиты на случай, если проскальзывает не завершающееся представление. Что-то, что убивает запросы, превышающие, скажем, 30 секунды были бы идеальными.

Для тестирования я просто поставил time.sleep(60) в виде.

Я пробовал настройку TimeOut 30 в Apache, но через 60 секунд мне все еще возвращается скручивание.

Я вижу, что сам mod_wsgi предлагает три разных значения времени ожидания, но ни одно из них, похоже, не относится к длительному запросу.

Для этого есть стандартная часть промежуточного программного обеспечения Django, или мне не хватает ручки на Apache или mod_wsgi?

1 Ответ

6 голосов
/ 12 октября 2011

На самом деле действительно трудно завершить один поток запросов Python в многопоточном приложении.Лучшее, что вы можете сделать, это принять решение остановить весь процесс и перезапустить его.Поскольку такое действие будет нарушать одновременные запросы, в результате вам действительно необходимо ограничиться однопоточной конфигурацией.

Даже тогда поддержка в mod_wsgi 3.X не идеальна для этого.Для режима демона есть таймаут бездействия, но он фактически приводит к перезапуску процесса в двух ситуациях.Первый - когда вообще нет запросов, и процесс простаивает.Во-вторых, когда все потоки запросов заблокированы, и время ожидания истекло.

В mod_wsgi 4.X (в данный момент в стволе хранилища) эти две концепции были разделены, и теперь тайм-аут бездействия применяется только к полностью незанятому процессубез одновременных запросов.Новый заблокированный тайм-аут был добавлен к отдельно указанному тайм-ауту, когда весь процесс блокируется.Именно этот последний вариант можно использовать.

Если вы хотите узнать больше о новой опции, вам нужно перейти к списку рассылки mod_wsgi, чтобы обсудить его.

...