Использование библиотеки запросов в хуке on_failure или on_sucesss заставляет задачу повторяться бесконечно - PullRequest
0 голосов
/ 26 февраля 2019

Вот что у меня есть:

import youtube_dl # in case this matters

class ErrorCatchingTask(Task):
    # Request = CustomRequest
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        # If I comment this out, all is well
        r = requests.post(server + "/error_status/") 
        ....

@app.task(base=ErrorCatchingTask, bind=True, ignore_result=True, max_retires=1)
def process(self, param_1, param_2, param_3):
    ...
    raise IndexError
    ...

Рабочий сгенерирует исключение, а затем, по-видимому, создаст новое задание с другим идентификатором задачи Received task: process[{task_id} Вот несколько вещей, которые я пробовал:

  • Вместо них импортируются from celery.worker.request import Request и переопределяются функции on_failure и on_success.
  • app.conf.broker_transport_options = {'visibility_timeout': 99999999999}
  • @app.task(base=ErrorCatchingTask, bind=True, ignore_result=True, max_retires=1)
  • Поворотвыкл DEBUG режим
  • Установите для ведения журнала значение info
  • Установите для CELERY_IGNORE_RESULT значение false ( Можно ли использовать запросы Python с сельдереем? )
  • import requests as apicall, чтобы исключить конфликт пространства имен
  • Патч денег requests Сельдерей + Eventlet + неблокирующие запросы
  • Переместить ErrorCatchingTask в отдельный файл

Если я не использую какие-либо функции ловушек, работник просто сгенерирует исключение и будет бездействовать, пока не запланировано следующее задание, чего я и ожидаю, даже когда использую ловушки.Это ошибка?Я искал проблемы с github, но не смог найти ту же проблему.Как отладить такую ​​проблему?

Django 1.11.16 сельдерея 4.2.1

1 Ответ

0 голосов
/ 13 марта 2019

Моя проблема была решена после того, как я использовал grequests

В моем случае, работник из сельдерея перенесет расписание, как только вызов conn.urlopen () будет вызван в requests/adapters.py.Другое поведение, которое я наблюдал, было, если бы у меня был открыт другой работник из другого проекта на той же машине, иногда бесконечное перепланирование останавливалось.Вероятно, это был какой-то механизм блокировки, который изначально предназначался для других целей.

Так что это привело меня к подозрению, что это действительно многопоточность, и после исследования, является ли библиотека requests поточно-безопасной, я обнаружил, что некоторые люди предлагая разные вещи. .Теоретически, исправление обезьяны должно иметь такой же эффект, как при использовании grequests, но это не то же самое, поэтому просто используйте вместо него библиотеку grequests или erequests.

Инструкция отладки Celery здесь

...