Я озирался немного, но я, может казаться, не решаю эту проблему, которую я имею. Я хотел бы выполнить сценарий Python в рамках представления моего django приложения. Я поместил код, который я хотел бы выполнить в django команде управления, таким образом, к нему можно получить доступ через командную строку python manage.py command-name
. Я затем пытался выполнить это использование команды subprocess.Popen("python manage.py command-name",shell=True)
.
Однако эта команда могла занять время для выполнения так, я хотел бы, чтобы представление продолжило и позволило сценарию выполняться в фоновом режиме. Используя подпроцесс. Один только 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 обращается к странице.
Возможно, вам стоит использовать сельдерей
Сельдерей - это очередь задач / очередь заданий на основе о распределенной передаче сообщений. это сфокусирован на работе в реальном времени
Я потратил много времени, пытаясь реализовать что-то подобное, но у меня были те же проблемы, что и у вас. В конце концов, я сдался и реализовал очередь beanstalk для выполнения работы.
http://kr.github.com/beanstalkd/
Я помещаю идентификатор в очередь в представлении Django, а затем имею команду управления для запуска потребителя (отслеживаемого супервизором).
Использование очереди означает, что вы можете расширяться до нескольких потребителей, и позволяет лучше управлять нагрузкой (при необходимости приостанавливая потребителя без потери необходимой работы).