Как запустить длительный процесс из представления Django? - PullRequest
15 голосов
/ 25 октября 2009

Мне нужно запустить процесс, который может занять несколько часов из представления 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 с минимальными потерями? Или я что-то не так делаю?

Ответы [ 4 ]

10 голосов
/ 25 октября 2009

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

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

5 голосов
/ 25 октября 2009

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

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

2 голосов
/ 25 октября 2009

Взгляните на код в kronos.py, чтобы увидеть одно решение этой проблемы.

http://www.razorvine.net/download/kronos.py

2 голосов
/ 25 октября 2009

http://code.google.com/p/django-command-extensions/wiki/JobsScheduling

Хорошая библиотека, которую вы можете использовать для выполнения этой задачи.

...