Выполнение подпроцесса использования сценария Python. Popen () в представлении django

Я озирался немного, но я, может казаться, не решаю эту проблему, которую я имею. Я хотел бы выполнить сценарий 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 обращается к странице.

5
задан Community 23 May 2017 в 12:25
поделиться

2 ответа

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

Сельдерей - это очередь задач / очередь заданий на основе о распределенной передаче сообщений. это сфокусирован на работе в реальном времени

3
ответ дан 14 December 2019 в 18:56
поделиться

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

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

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

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

2
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: