Как начать долговременный процесс с представления Django?

Мне нужно запустить процесс, который может занять несколько часов с представлением Django. Мне не нужно знать состояние или общаться с ним, но мне нужно, чтобы это представление перенаправлялось сразу после запуска процесса.

Я пробовал использовать subprocess.Popen, используя его в новом threading.Thread, multiprocessing.Process. Тем не менее, родительский процесс продолжает зависать до тех пор, пока ребенок не завершится. Единственный способ, который почти делает это, - использовать вилку. Очевидно, что это не так хорошо, поскольку он оставляет процесс зомби позади, пока родитель не закончит.

То, что я пытаюсь сделать при использовании fork:

if os.fork() == 0:
    subprocess.Popen(["/usr/bin/python", script_path, "-v"])
else:
    return HttpResponseRedirect(reverse('view_to_redirect'))

Итак, есть ли способ запустить полностью независимый процесс из представления Django с минимальными потерями? Или я делаю что-то неправильно?

Ответы

Ответ 1

Я не знаю, подходит ли это для вашего дела, но вот что я делаю: я использую очередь задач (через модель django); когда вызов открывается, он вводит новую запись в задачи и с радостью переадресовывает. Задачи, в свою очередь, выполняются cron на регулярной основе независимо от django.

Изменить: cron вызывает соответствующую (и настраиваемую) команду django для выполнения задачи.

Ответ 2

Прежде всего - попробуйте использовать cron для вашей задачи, как раньше говорят shanyu.

Если это вас не устраивает - попробуйте использовать CeleryProject для очереди задач для Django. Для работы он использует RabbitMQ. И вот немного overview для простого использования фьючерсов базирования