Django не выходит после завершения тестов при использовании модуля потоков - PullRequest
1 голос
/ 03 апреля 2019

Я делаю интеграционные тесты, используя django.test.SimpleTestCase.
После запуска python manage.py test тесты выполняются успешно, и терминал зависает с сообщением:

---------------------------
Ran 5 tests in 1.365s

OK

Проблема в том, что в настоящее время я возвращаюсь к терминалу, используя CTRL + C, но я хочу иметь автоматические тесты в моем конвейере CI / CD.

Я что-то не так сделал, выполняя тесты? Или это нормальное поведение? В этом случае, есть ли способ в Bash программно выполнить, а затем выйти из тестов?

EDIT:
После глубокого анализа моего приложения я смог определить причину такого поведения. Я использую threading таким образом, как в моем views.py:

def __pooling():
  wait_time = 10
  call_remote_server()
  threading.Timer(wait_time, __pooling).start()

__pooling()

В основном мне нужно, чтобы мое приложение время от времени делало что-то асинхронное. Должен ли я изменить способ, которым я делаю пул? Или я должен отключить его (как?) Во время тестов?

1 Ответ

1 голос
/ 05 апреля 2019

Мне удалось определить причину такого поведения.Я использую threading таким образом, как показано в моем views.py:

def __pooling():
  wait_time = 10
  call_remote_server()
  threading.Timer(wait_time, __pooling).start()

__pooling()

В основном мне нужно, чтобы мое приложение время от времени делало что-то асинхронное.Должен ли я изменить способ создания пула?

Я не до конца понимаю ваши потребности, но более традиционный подход - планирование задачи (вероятно, команда управления * 1011).*) за пределами самого Джанго.Планировщик уровня операционной системы, такой как cron или Планировщик задач Windows , что-то вроде APScheduler , или очередь задач, такая как Celery , все будет разумновыбор.

Или я должен отключить его (как?) во время тестов?

Я не рекомендую продолжать использовать вашу функцию __pooling(), как она существует сегодня,По моему мнению, такого рода вещи не относятся к вашим views.py.Но если вы хотите сохранить его, может помочь что-то вроде

from django.conf import settings

if not settings.DEBUG:
  __pooling()

.Ваша __pooling() функция будет вызываться только тогда, когда DEBUG ложно, как и должно быть в производстве.(Если это также ложно в вашей среде CI, вы можете выбрать другой существующий параметр или добавить что-то в ваш settings.py специально для управления этим.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...