Выполнение скрипта Python с использованием subprocess.Popen () в представлении Django - PullRequest
5 голосов
/ 29 июня 2010

Я немного осмотрелся, но не могу решить эту проблему, которая у меня есть. Я хотел бы выполнить скрипт Python в представлении моего приложения Django. Я поместил код, который хотел бы выполнить, в команду управления django, чтобы он был доступен через командную строку python manage.py command-name. Затем я попытался запустить эту команду, используя subprocess.Popen("python manage.py command-name",shell=True).

Однако выполнение этой команды может занять некоторое время, поэтому я бы хотел, чтобы представление продолжалось и позволяло сценарию выполняться в фоновом режиме. Использование subprocess.Popen, по-видимому, приводит к зависанию представления до завершения работы скрипта, поэтому я попытался использовать поток (следующий другой SA вопрос):

class SubprocessThread(threading.Thread):
def __init__(self, c):
    self.command = c
    self.stdout = None
    self.stderr = None
    threading.Thread.__init__(self)

def run(self):
    p = subprocess.Popen(self.command,
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)

    self.stdout, self.stderr = p.communicate()

и затем выполнить его:

t = SubprocessThread("python manage.py command-name")
t.setDaemon(True)
t.start()
t.join()

Однако представление по-прежнему зависает: курсор имеет символ «занято», а AJAX на странице не загружается. В противном случае HTML-код страницы, кажется, загружается нормально, а команды в представлении после вызова потока появляются нормально завершенными (до завершения сценария). Может кто-нибудь, пожалуйста, помогите мне? Я бы хотел, чтобы скрипт выполнялся и выполнял свои функции, не задерживая просмотр или вызовы AJAX на странице.

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

Возможно, вам следует использовать celery

Celery - это очередь задач / очередь заданий, основанная на распределенной передаче сообщений.Он ориентирован на работу в режиме реального времени

2 голосов
/ 30 июня 2010

Я потратил много времени, пытаясь реализовать нечто подобное, но у меня были те же проблемы, что и у вас. В конце концов я сдался и реализовал очередь бобовых стеблей, чтобы справиться с работой.

http://kr.github.com/beanstalkd/

Я помещаю идентификатор в очередь в представлении Django, а затем имею команду управления для запуска потребителя (отслеживается супервизором).

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

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