Как начать долговременный процесс с представления 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 для простого использования фьючерсов базирования
Ответ 3
http://code.google.com/p/django-command-extensions/wiki/JobsScheduling
Это хорошая библиотека, которую вы можете использовать для выполнения этой задачи.
Ответ 4
Посмотрите на код в kronos.py, чтобы увидеть одно решение этой проблемы.
http://www.razorvine.net/download/kronos.py