Запуск задачи Celery при невозможности импортировать эту задачу - PullRequest
6 голосов
/ 19 декабря 2011

У меня есть два сервера: на одном запущено приложение django, а на другом - очередь rabbitmq и работник сельдерея.Мой файл tasks.py на сервере, на котором работает очередь / работник, содержит следующую задачу:

@task(queue="reports")
def test_task():
    time.sleep(120)

Моя цель - выполнить эту задачу из представления django.Поскольку код задачи находится на сервере, отличном от представления django, которое я хотел бы вызвать для задачи, я пытаюсь использовать следующий код для отправки задачи из django на рабочую машину.

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue)

Я нашел этот метод здесь , но пока тестирование не сработало.

Я тестирую с tail -F в лог-файле сельдерея на сервере сельдерея,затем перейдите к URL-адресу представления, содержащего send_task, в браузере.Я ищу задачу, которая будет отображаться как «получено» в выводе хвоста, но это не так.

Уровень журнала работника сельдерея - DEBUG, файл журнала показывает, что задача зарегистрирована с правильнымname, а файл settings.py приложения django содержит правильный IP-адрес и учетные данные для сервера rabbitmq.Пробуя разные подходы, я иногда видел сообщение об ошибке в лог-файле сельдерея, когда менял строку, переданную в send_task, на что-то, что было недопустимым (например, send_task ('asdf')).Это вызвало UnregisteredError в файле журнала.Однако такое случается иногда, и до сих пор при тестировании различных комбинаций параметров и вызовов я не нашел способа надежно воспроизвести поведение.

Кроме того, это соответствующий раздел файла settings.py напроект django (с удаленными фактическими значениями):

CELERY_RESULT_BACKEND = 'amqp'
BROKER_HOST = 'the.correct.IP.address'
BROKER_USER = 'the_correct_user'
BROKER_PASSWORD = 'the_correct_pass'
BROKER_VHOST = 'the_correct_vhost'
BROKER_PORT = 5672

Я погуглил и почти ничего не нашел по send_task.Есть идеи, что я могу делать не так?

Ответы [ 2 ]

8 голосов
/ 20 декабря 2011

Решено, оказалось, что ключевое слово издателя, которое я передавал send_task, было недействительным и выдало ошибку.Не увидел ошибку, потому что я AJAX-запросил страницу, а не переходил к ней напрямую.Все остальное в этой ситуации было правильным.Я также удалил ненужные ключевые аргументы и аргументы, передаваемые send_task.

send_task("tasks.test_task", task_id=task_id, queue=queue)
2 голосов
/ 20 декабря 2011

То, что [я думал, вы пытались], сделать невозможно.Работникам сельдерея требуется доступ к коду задачи, который они должны выполнить.Обойти это невозможно.

ПЕРЕСМОТРЕНО:

Но то, что вы действительно хотите сделать, это: иметь код, доступный для рабочих, но НЕ для представления Django, которое должно относиться к задачам толькоимя.

...