Что нового в 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), если ответы не были получены.