Что нового в Celery 2.5

Цель Celery - стать гибким и надежным, лучшим в своем классе решением для обработки огромного количества сообщений в распределенном режиме, одновременно предоставляя операторам инструменты для обслуживания такой системы.

Celery имеет большое и разнообразное сообщество пользователей и разработчиков, вам стоит присоединиться к нам on IRC или << 1 >>>.

Чтобы узнать больше о сельдерее, посетите наш сайт website.

Хотя эта версия обратно совместима с предыдущими версиями, важно, чтобы вы прочитали следующий раздел.

Если вы используете Celery в сочетании с Django, вы также должны прочитать django-celery changelog <djcelery:version-2.5.0> и обновиться до django-celery 2.5.

Эта версия официально поддерживается на CPython 2.5, 2.6, 2.7, 3.2 и 3.3, а также PyPy и Jython.

Важные замечания

Пул соединений брокера теперь включен по умолчанию

По умолчанию установлено ограничение в 10 соединений, если у вас много потоков/зеленых потоков, использующих соединения одновременно, вы можете захотеть изменить это ограничение, чтобы избежать конкуренции.

Для получения дополнительной информации см. параметр BROKER_POOL_LIMIT.

Также обратите внимание, что задания на публикацию будут повторяться по умолчанию, чтобы изменить это значение или политику повторных попыток по умолчанию, смотрите CELERY_TASK_PUBLISH_RETRY и CELERY_TASK_PUBLISH_RETRY_POLICY.

Rabbit Result Backend: Обмен больше не является автоудалением

Обмен, используемый для результатов в бэкенде результатов Rabbit (AMQP), раньше имел установленный флаг auto_delete, что могло привести к состоянию гонки, вызывающему раздражающее предупреждение.

Для пользователей RabbitMQ

Старые обмены, созданные с включенным флагом auto_delete, должны быть удалены.

Команда camqadm может быть использована для удаления предыдущего обмена:

$ camqadm exchange.delete celeryresults

В качестве альтернативы удалению старого обмена вы можете настроить новое имя для обмена:

CELERY_RESULT_EXCHANGE = 'celeryresults2'

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

Решение для висящих работников (но должно быть включено вручную)

Настройка CELERYD_FORCE_EXECV была добавлена для решения проблемы с тупиками, возникающими при смешивании потоков и fork:

CELERYD_FORCE_EXECV = True

Эта настройка рекомендуется для всех пользователей, использующих пул prefork, но особенно для пользователей, также использующих ограничения по времени или настройку max tasks per child.

  • Смотрите Python Issue 6721, чтобы узнать больше об этой проблеме, и почему использование execv`() является единственным безопасным решением.

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

  • Это уже поведение по умолчанию в Windows.

  • Это будет поведение по умолчанию для всех платформ в будущей версии.

Оптимизация

  • Путь кода, используемый при выполнении задания рабочим, был значительно оптимизирован, что означает, что рабочий может обрабатывать гораздо больше заданий в секунду по сравнению с предыдущими версиями. Например, пул solo теперь может обрабатывать до 15000 задач в секунду на 4-ядерном MacBook Pro при использовании транспорта pylibrabbitmq, тогда как раньше он мог выполнять только 5000 задач в секунду.

  • Отслеживание ошибок задачи теперь намного короче.

  • Исправлена заметная задержка в обработке заданий при включенных ограничениях скорости.

Изменения в сроках амортизации

Перемещение

  • Старая подпись TaskSet (task_name, list_of_tasks) больше не может быть использована (первоначально планировалось удалить ее в версии 2.4). Устаревшие атрибуты .task_name и .task также были удалены.

  • Функции celery.execute.delay_task, celery.execute.apply и celery.execute.apply_async были удалены (первоначально планировалось удалить в версии 2.3).

  • Встроенная задача ping была удалена (первоначально планировалось удалить ее в версии 2.3). Вместо него используйте команду ping broadcast.

  • Больше невозможно импортировать subtask и TaskSet из celery.task.base, пожалуйста, импортируйте их из celery.task (первоначально планировалось удалить в 2.4).

Устаревшие модули

  • Модуль celery.decorators изменил статус с ожидающего устаревания на устаревший и планируется к удалению в версии 4.0. Вместо него следует использовать модуль celery.task.

Новости

Поддержка часовых поясов

Теперь Celery можно настроить на обработку всех входящих и исходящих дат как UTC, а также настроить локальный часовой пояс.

Это пока не включено по умолчанию, поскольку включение поддержки часовых поясов означает, что работники, работающие с версиями до 2.5, будут рассинхронизированы с обновленными работниками.

Чтобы включить UTC, необходимо установить CELERY_ENABLE_UTC:

CELERY_ENABLE_UTC = True

Если включена функция UTC, даты и время в сообщениях задач будут преобразовываться в UTC, а затем конвертироваться обратно в местный часовой пояс при получении работником.

Вы можете изменить локальный часовой пояс с помощью параметра CELERY_TIMEZONE. Установка библиотеки pytz рекомендуется при использовании пользовательского часового пояса, чтобы поддерживать определение часового пояса в актуальном состоянии, но она будет возвращаться к системному определению часового пояса, если оно доступно.

UTC будет включен по умолчанию в версии 3.0.

Примечание

django-celery будет использовать локальный часовой пояс, указанный параметром TIME_ZONE, он также будет учитывать новый параметр USE_TZ, введенный в Django 1.4.

Новый сериализатор безопасности с использованием криптографической подписи

Добавлен новый сериализатор, который подписывает и проверяет подпись сообщений.

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

См.также

Безопасность

При участии Мгера Мовсисяна.

Новая установка CELERY_ANNOTATIONS

Этот новый параметр позволяет конфигурации изменять классы задач и их атрибуты.

Параметр может быть диктой или списком объектов аннотации, которые фильтруют задачи и возвращают карту атрибутов для изменения.

В качестве примера можно привести аннотацию для изменения атрибута rate_limit для задачи tasks.add:

CELERY_ANNOTATIONS = {'tasks.add': {'rate_limit': '10/s'}}

или изменить одинаково для всех задач:

CELERY_ANNOTATIONS = {'*': {'rate_limit': '10/s'}}

Вы можете изменить и методы, например, обработчик on_failure:

def my_on_failure(self, exc, task_id, args, kwargs, einfo):
    print('Oh no! Task failed: %r' % (exc,))

CELERY_ANNOTATIONS = {'*': {'on_failure': my_on_failure}}

Если вам нужна большая гибкость, вы также можете создавать объекты, которые фильтруют задачи для аннотирования:

class MyAnnotate(object):

    def annotate(self, task):
        if task.name.startswith('tasks.'):
            return {'rate_limit': '10/s'}

CELERY_ANNOTATIONS = (MyAnnotate(), {other_annotations,})

current предоставляет текущую выполняемую задачу

Новый прокси celery.task.current всегда будет отдавать текущую выполняющуюся задачу.

Пример:

from celery.task import current, task

@task
def update_twitter_status(auth, message):
    twitter = Twitter(auth)
    try:
        twitter.update_status(message)
    except twitter.FailWhale, exc:
        # retry in 10 seconds.
        current.retry(countdown=10, exc=exc)

Раньше здесь нужно было набирать update_twitter_status.retry(…), что могло раздражать при длинных именах задач.

Примечание

Это не будет работать, если функция задачи вызывается напрямую (т.е. update_twitter_status(a, b)). Для этого необходимо использовать apply: update_twitter_status.apply((a, b)).

Другие новости

  • Теперь зависит от Kombu 2.1.0.

  • Эффективная поддержка Chord для бэкенда Memcached (проблема #533)

    Это означает, что Memcached присоединяется к Redis в способности делать неполлирующие аккорды.

    Внесено Дэном МакГи.

  • Добавляет поддержку Chord для бэкенда результатов Rabbit (amqp)

    Бэкенд результатов Rabbit теперь может использовать запасной аккорд.

  • Отправка QUIT на celeryd теперь приведет к его холодному завершению.

    То есть, он не завершит выполнение задач, над которыми работает в данный момент.

    Внесено Алеком Клоузом.

  • Новый «детальный» режим для бэкенда Cassandra.

    Позволяет иметь «детальный» режим для бэкенда Cassandra. Идея заключается в том, чтобы сохранить все состояния, используя широкие колонки Cassandra. Новые состояния затем добавляются к строке как новые столбцы, при этом последнее состояние является последним столбцом.

    См. настройку CASSANDRA_DETAILED_MODE.

    Внесено Стивом Морином.

  • Парсер Crontab теперь соответствует поведению Vixie Cron при разборе диапазонов с шагами (например, 1-59/2).

    Внесено Даниэлем Хеппером.

  • celerybeat теперь может быть настроен в командной строке, как celeryd.

    Дополнительная конфигурация должна быть добавлена в конец списка аргументов, за которым следует --, например:

    $ celerybeat -l info -- celerybeat.max_loop_interval=10.0
    
  • Теперь ограничивает количество кадров в трассировке, чтобы celeryd не аварийно завершалась при исключениях с превышением максимального предела рекурсии (проблема #615).

    Предел устанавливается как текущий предел рекурсии, деленный на 8 (по умолчанию это 125).

    Для получения или установки текущего предела рекурсии используйте sys.getrecursionlimit() и sys.setrecursionlimit().

  • Теперь больше информации сохраняется в pickleable traceback.

    Это было добавлено для того, чтобы Sentry мог показывать больше деталей.

    При участии Шона О’Коннора.

  • CentOS init-script был обновлен и должен быть более гибким.

    Внесено Эндрю МакФагом.

  • Бэкенд результатов MongoDB теперь поддерживает forget().

    При участии Эндрю МакФага

  • task.retry() теперь повторно вызывает исходное исключение, сохраняя исходную трассировку стека.

    Предложено @ojii.

  • Аргумент –uid для демонов теперь использует initgroups() для установки групп на все группы, в которых состоит пользователь.

    При участии Лукаша Олеся.

  • celeryctl: Добавлена команда shell.

    Оболочка будет иметь текущее_приложение (celery) и все задачи, автоматически добавленные в locals.

  • celeryctl: Добавлена команда migrate.

    Команда migrate перемещает все задачи из одного брокера в другой. Обратите внимание, что эта команда является экспериментальной, и прежде чем приступить к ее выполнению, необходимо создать резервную копию данных.

    Примеры:

    $ celeryctl migrate redis://localhost amqp://localhost
    $ celeryctl migrate amqp://localhost//v1 amqp://localhost//v2
    $ python manage.py celeryctl migrate django:// redis://
    
  • Маршрутизаторы теперь могут переопределять exchange и routing_key, используемые для создания отсутствующих очередей (проблема #577).

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

    Это полезно при использовании классов маршрутизации, которые определяют пункт назначения во время выполнения.

    При участии Акиры Мацузаки.

  • Бэкенд результатов Redis: Добавлена поддержка параметра max_connections.

    Теперь можно настроить максимальное количество одновременных соединений в пуле соединений Redis, используемом для получения результатов.

    Настройка максимального количества соединений по умолчанию может быть настроена с помощью параметра CELERY_REDIS_MAX_CONNECTIONS, или может быть изменена индивидуально с помощью параметра RedisBackend(max_connections=int).

    Внесено Стивом Морином.

  • Бэкенд результатов Redis: Добавляет возможность ожидания результатов без опроса.

    Внесено Стивом Морином.

  • Бэкенд результатов MongoDB: Теперь поддерживает сохранение и восстановление taskset.

    При участии Жюльена Пуассонье.

  • В документации есть новое руководство Безопасность.

  • Обновлены init-скрипты и исправлено множество ошибок.

    При участии Криса Стритера.

  • Пользователь (тильда) теперь расширяется в аргументах командной строки.

  • Теперь можно настроить переменную окружения CELERYCTL в /etc/default/celeryd.

    Хотя это не обязательно для работы, celeryctl используется для команды celeryd status, и для ее работы необходимо настроить путь к celeryctl.

    Поваренная книга по демонизации содержит примеры.

    Внесен Джудом Нагурни.

  • Бэкенд результатов MongoDB теперь может использовать наборы реплик.

    Внесено Иваном Мецларом.

  • gevent: Теперь поддерживает автомасштабирование (выпуск #599).

    Внесено Марком Лавином.

  • мультипроцессинг: Поток-посредник теперь всегда включен, даже если ограничения скорости отключены, поскольку известно, что семафор пула блокирует основной поток, в результате чего широковещательные команды и выключение зависят от освобождения семафора.

Исправления

  • Исключения, которые повторно поднимаются с новым объектом исключения, теперь сохраняют оригинальную трассировку стека.

  • Windows: Исправлено предупреждение no handlers found for multiprocessing.

  • Windows: Теперь можно использовать программу celeryd.

    Ранее пользователям Windows приходилось запускать celeryd с помощью python -m celery.bin.celeryd.

  • Бэкенд результатов Redis: Теперь используется команда SETEX для установки ключа результата и срока действия атомарно.

    Предложено @yaniv-aknin.

  • celeryd: Исправлена проблема, при которой выключение зависало, когда для завершения использовалось Control-c.

  • celeryd: Больше не происходит сбоев при возникновении ошибок канала.

    Исправление внесено Роджером Ху.

  • Исправлена утечка памяти в пуле эвентов, вызванная использованием greenlet.getcurrent.

    Исправление внесено Игнасом Микалаюнасом.

  • Бэкенд Cassandra: Больше не используется pycassa.connect(), который устарел с pycassa 1.4.

    Исправление внесено Джеффом Террасом.

  • Исправлены ошибки декодирования unicode, которые могли возникать при отправке электронных писем с ошибками.

    Исправление внесено Сон Вун Муном.

  • Программы celery.bin теперь всегда определяют __package__, как рекомендовано в PEP-366.

  • send_task теперь выдает предупреждение при использовании в комбинации с CELERY_ALWAYS_EAGER (проблема #581).

    При участии Мгера Мовсисяна.

  • apply_async теперь пересылает исходные аргументы ключевых слов в apply, когда включено CELERY_ALWAYS_EAGER.

  • celeryev теперь пытается восстановить соединение, если соединение с брокером потеряно (проблема #574).

  • celeryev: Исправлен сбой, возникающий, если у задачи нет информации о связанном работнике.

    Исправление внесено Мэттом Уильямсоном.

  • Текущая дата и время теперь последовательно берутся из текущего метода загрузчиков now.

  • Теперь показывает полезное сообщение об ошибке при предоставлении модуля конфигурации, заканчивающегося на .py, который не может быть импортирован.

  • celeryctl: Аргументы --expires и << 2 >>> команды apply теперь могут быть строкой в формате ISO-8601.

  • celeryctl теперь завершается со статусом выхода EX_UNAVAILABLE (69), если ответы не были получены.

Вернуться на верх