Ответы пользователя по тегу Celery
  • Возможен ли вызов задачи в цепочке с параметрируемой опцией max_retries?

    tumbler
    @tumbler
    бекенд-разработчик на python
    Вариант инициализации сигнатуры без шоткатов:
    task.signature(args=..., kwargs=..., **options)

    The default is 3. A value of None will disable the retry limit and the task will retry forever until it succeeds.


    Проблема в том, что None где-то там внутри означает "не задано" и дефолтится к дефолтным 3 повторам. Во всяком случае так было во времена 3.1. Мы внутри для бесконечных повторов модифицируем task.request.retries.
    Ответ написан
  • Как организовать периодические задания в многопользовательском приложении?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    Декораторы работают в момент импорта, расписание по пользователям лучше в БД хранить:

    https://django-celery-beat.readthedocs.io/en/latest/
    Ответ написан
  • Как реализовать изменение данных в БД в фоновой задаче?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    Celery позволяет запускать произвольный код в другом процессе.
    import django
    django.setup() 
    
    @app.task
    def do_something():
        pass


    Собственно всё, что надо чтобы начать использовать celery. Про настройку хорошо написано в документации.
    Ответ написан
  • Как инициировать «генерацию» других форматов видео в django-videokit?

    tumbler
    @tumbler Куратор тега Django
    бекенд-разработчик на python
    при запуске под *nix видео-файлы, «всосанные» через szVideoName, не имеют статуса на чтение и, соотвественно, не могут быть отданы клиенту веб-сервером

    Если веб-сервер запущен под пользователем web, то права -rw------- означают доступ на чтение и запись для этого самого пользователя, значит отдача веб-сервером возможно. Это легко проверить, попытавшись скачать этот файл curl-ом, например.
    У меня гипотеза, что как-то всетаки Celery файл подхватывает и что-то с ним делает (или пытается). Но вот что?

    Celery делает ровно то, что указано в теле соответствующих задач, описанных в проекте django-videokit. Если любопытно, надо искать в исходниках "батарейки".
    Но вот создается это процесс, и если создается, то работает ли он?

    Во-первых, стоит почитать логи celery, там наверняка будут какие-то ошибки запуска (например, отсутствие ffmpeg на машине :-) ). Во-вторых, ffmpeg на любую ошибку ругается кодом ответа, отличным от нуля. Если django-videokit этот код ответа не проверяет - это плохая "батарейка".

    это мой первый опыт использования Celery и как там должна происходить инициализация очередей, выполнение заданий и тому подобное -- не понимаю

    Это очень обширный вопрос, для ответа на который нужно объяснить основы протокола AMQP, который реализует RabbitMQ, половину документации Celery "и тому подобное".
    Если кратко, то схема следующая:
    1. при вызове celery_task.delay() отправляется сообщение в RabbitMQ
    2. RabbitMQ маршрутизирует сообщение в нужную очередь, в соответствии с настройками celery
    3. celery берет задачу в обработку, выполняет код, являющийся телом задачи
    4. после выполнения задачи, результат (return) записывается в redis
    5. код, отправивший задачу, может подождать ее завершения, вызвав async_result.get, который внутри периодически опрашивает redis, не появился ли там результат обработки задачи.
    что предварительно надо установить RabbitMQ. Но в requirements.txt примера указан в числе прочего еще и redis==2.10.5.

    Традиционно, celery использует RabbitMQ для передачи задач и Redis для хранения результатов их выполнения.

    Мне не понятно как и кто тогда управляет очередями

    Очередями (их настройкой) заведует Celery, объявляя их при старте worker-ов.
    Ответ написан