Выполнение скрипта Python в качестве задачи Celery

Я пытаюсь запустить скрипт Python как задачу сельдерея с Django. Проблема, с которой я сталкиваюсь, заключается в том, что задача считает ее завершенной, как только скрипт начинает работать. Первоначально я использовал subprocess.popen() в файле tasks.py, но понял, что это будет означать, что задача будет завершена, как только будет введена команда popen(). Я изменил свой код tasks.py, чтобы вызвать функцию в моем скрипте Python, которая запускает скрипт; однако это по-прежнему выполняется, как если бы задача была немедленно завершена. Я смущен, потому что в цветке говорится, что задача выполнена, но в журнале сельдерея он выводит данные журнала, определенные в сценарии, который я запускаю. Я нашел следующее связанный пост. Я считаю, что следую его предложению выполнить функцию python из tasks.py.

Задачи.py:

def exe(workDir, cancelRun):
    sys.path.append(workDir)
    import run

    if cancelRun=='True':
        task_id=exe.request.id
        revoke(task_id,terminate=True)
    else:
        run.runModel(workDir)
        task_id=exe.request.id
        return task_id

Код функции runModel:

def runModel(scendir):
    fullpath=scendir+'/run.py'
    os.chdir(scendir)
    p=Process(target=myMain,args=(scendir,))
    p.start()
    p.join()

person Jason Hawkins    schedule 10.07.2014    source источник
comment
Что произойдет, если вы запустите команду (та, которая выполняется вашей задачей) на вашем терминале? Если он возвращается немедленно, возможно, он демонизирует себя, скажем, через fork(). Другой способ проверить причину — использовать оболочку Django: оболочку python manage.py, затем выполнить необходимый импорт и вызвать свои функции вручную.   -  person jweyrich    schedule 11.07.2014
comment
Выполнение из командной строки делает то, что я ожидаю. Он запускает сценарий, выполнение которого обычно занимает несколько часов. Я также подумал, что моя логика для html может быть неправильной, и я возвращаю нужную страницу после того, как задача завершилась по ошибке.   -  person Jason Hawkins    schedule 11.07.2014
comment
На самом деле моя проблема заключалась в том, что я не понимал вывод сельдерея. Я смотрел на вкладку «рабочий» цветка, а не на «задачи». Я также интерпретировал регистрацию в celery, начинающуюся в начале моего файла журнала, как признак того, что он снова запускает процесс. Оказывается, он создавал вторую задачу (как и ожидалось и хотелось). Было хорошо убедиться, что в командной строке все работает.   -  person Jason Hawkins    schedule 11.07.2014
comment
Большой! Опубликую мой комментарий как фактический ответ.   -  person jweyrich    schedule 11.07.2014


Ответы (1)


Что произойдет, если вы запустите команду (та, которая выполняется вашей задачей) на вашем терминале? Если он возвращается немедленно, возможно, он демонизирует себя, скажем, через fork().

Другой способ проверить причину — использовать оболочку Django: python manage.py shell, а затем выполнить необходимый импорт для вызова ваших функций вручную.

person jweyrich    schedule 11.07.2014