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


person excieve    schedule 24.10.2009    source источник


Ответы (4)


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

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

person shanyu    schedule 24.10.2009

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

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

person Oduvan    schedule 25.10.2009

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

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

person Mike    schedule 25.10.2009

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

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

person Paul McMillan    schedule 25.10.2009