История изменений для Celery 1.0

1.0.6

дата выхода:

2010-06-30 09:57 a.m. CEST

релиз на:

Спросите Солема

  • RabbitMQ 1.8.0 расширил свои тесты эквивалентности обмена, включив в них auto_delete и durable. Это сломало бэкенд AMQP.

    Если вы уже использовали бэкенд AMQP, это означает, что вам придется удалить предыдущие определения:

    $ camqadm exchange.delete celeryresults
    

    или:

    $ python manage.py camqadm exchange.delete celeryresults
    

1.0.5

дата выхода:

2010-06-01 02:36 p.m. CEST

релиз на:

Спросите Солема

Критический

  • INT/Control-c убивает пул, резко завершая текущие выполняющиеся задачи.

    Исправлено, если заставить рабочие процессы пула игнорировать SIGINT.

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

    Смотрите выпуск #122.

  • Теперь зависит от billiard >= 0.3.1

  • worker: Ранее исключения, вызванные рабочими компонентами, могли затормозить запуск, теперь исключения корректно регистрируются и завершаются.

  • рабочий: Счетчики предварительной выборки были установлены слишком поздно. Теперь QoS устанавливается как можно раньше, так что worker: не может пропустить все сообщения при запуске.

Изменения

  • celery.contrib.abortable: Прерванные задачи.

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

  • EventDispatcher: Больше не создается AMQP-канал, если события отключены

  • Добавлены необходимые имена пакетов RPM в разделе [bdist_rpm] для поддержки сборки RPM из исходных текстов с использованием setup.py.

  • Запуск модульных тестов: NOSE_VERBOSE переменная окружения теперь позволяет выводить подробную информацию из Nose.

  • celery.execute.apply(): Передавайте аргументы файла журнала/уровня журнала как kwargs задачи.

    Смотрите выпуск #110.

  • celery.execute.apply: При ошибке должно возвращаться исключение, а не ExceptionInfo.

    Смотрите выпуск #111.

  • Добавлены новые записи в FAQs:

    • Следует ли мне использовать retry или acks_late?

    • Могу ли я назвать задачу по имени?

1.0.4

дата выхода:

2010-05-31 09:54 a.m. CEST

релиз на:

Спросите Солема

  • Changelog объединен с 1.0.5, так как релиз так и не был анонсирован.

1.0.3

дата выхода:

2010-05-15 03:00 p.m. CEST

релиз на:

Спросите Солема

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

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

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

    Более подробную информацию можно найти на сайте http://bit.ly/9hom6T

  • Бэкенд результатов базы данных: результат теперь явно устанавливает null=True, поскольку django-picklefield версии 0.1.5 изменил поведение по умолчанию прямо у нас под носом :(

    См.: http://bit.ly/d5OwMr

    Это означает, что те, кто создал свои таблицы Celery (через syncdb или celeryinit) с django-picklefield` версий >= 0.1.5, должны изменить свои таблицы, чтобы позволить полю результата быть NULL вручную.

    MySQL:

    ALTER TABLE celery_taskmeta MODIFY result TEXT NULL
    

    PostgreSQL:

    ALTER TABLE celery_taskmeta ALTER COLUMN result DROP NOT NULL
    
  • Удалено Task.rate_limit_queue_type, поскольку оно не было действительно полезным и затрудняло рефакторинг некоторых частей.

  • Теперь зависит от carrot >= 0.10.4

  • Теперь зависит от бильярда >= 0.3.0

Новости

  • Бэкенд AMQP: Добавлена поддержка таймаута для result.get() / result.wait().

  • Новый параметр задачи: Task.acks_late (по умолчанию: CELERY_ACKS_LATE)

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

    Примечание

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

  • Добавлено Crontab-подобное планирование для периодических задач.

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

    Вы можете указать минуту (0-59), час (0-23) и/или день недели (0-6, где 0 - воскресенье, или по именам: sun, mon, tue, wed, thu, fri, sat).

    Примеры:

    from celery.schedules import crontab
    from celery.decorators import periodic_task
    
    @periodic_task(run_every=crontab(hour=7, minute=30))
    def every_morning():
        print('Runs every morning at 7:30a.m')
    
    @periodic_task(run_every=crontab(hour=7, minute=30, day_of_week='mon'))
    def every_monday_morning():
        print('Run every monday morning at 7:30a.m')
    
    @periodic_task(run_every=crontab(minutes=30))
    def every_hour():
        print('Runs every hour on the clock (e.g., 1:30, 2:30, 3:30 etc.).')
    

    Примечание

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

  • TaskPool.apply_async: Теперь поддерживает аргумент accept_callback.

  • apply_async: Теперь поднимает ValueError, если args задачи не является списком, или kwargs не является кортежем (проблема #95).

  • Task.max_retries теперь может иметь значение None, что означает, что попытка будет повторяться вечно.

  • celerybeat: Теперь при публикации больших наборов задач повторно используется одно и то же соединение.

  • Изменили пример блокировки задач в документации, чтобы использовать cache.add для атомарной блокировки.

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

    Если Task.track_started включен, задача будет сообщать о своем статусе как «запущена», когда задача выполняется рабочим.

    Значение по умолчанию - False, так как обычное поведение заключается в том, чтобы не сообщать о таком уровне детализации. Задачи либо ожидают выполнения, либо завершены, либо ожидают повторной попытки. Наличие статуса «начато» может быть полезно, когда есть долго выполняющиеся задачи и есть необходимость сообщить, какая задача выполняется в данный момент.

    Глобальное значение по умолчанию может быть отменено параметром CELERY_TRACK_STARTED.

  • Руководство пользователя: Новый раздел Советы и лучшие практики.

    Взносы приветствуются!

Команды дистанционного управления

  • Команды дистанционного управления теперь могут отправлять ответы обратно вызывающему абоненту.

    Существующие команды были улучшены для отправки ответов, а клиентский интерфейс в celery.task.control имеет новые ключевые аргументы: reply, timeout и limit. Где reply означает, что команда будет ждать ответов, timeout - это время в секундах для прекращения ожидания ответов, а limit - это максимальное количество ответов.

    По умолчанию он будет ждать как можно больше ответов в течение одной секунды.

    • rate_limit(task_name, destination=all, reply=False, timeout=1, limit=0)

      Worker возвращает {„ok“: message} при успехе, или {„failure“: message} при неудаче.

      >>> from celery.task.control import rate_limit
      >>> rate_limit('tasks.add', '10/s', reply=True)
      [{'worker1': {'ok': 'new rate limit set successfully'}},
       {'worker2': {'ok': 'new rate limit set successfully'}}]
      
    • ping(destination=all, reply=False, timeout=1, limit=0)

      Рабочий возвращает простое сообщение «pong».

      >>> from celery.task.control import ping
      >>> ping(reply=True)
      [{'worker1': 'pong'},
       {'worker2': 'pong'},
      
    • revoke(destination=all, reply=False, timeout=1, limit=0)

      Worker просто возвращает True.

      >>> from celery.task.control import revoke
      >>> revoke('419e46eb-cf6a-4271-86a8-442b7124132c', reply=True)
      [{'worker1': True},
       {'worker2'; True}]
      
  • Теперь вы можете добавлять свои собственные команды дистанционного управления!

    Команды дистанционного управления - это функции, зарегистрированные в реестре команд. Регистрация команды осуществляется с помощью команды celery.worker.control.Panel.register():

    from celery.task.control import Panel
    
    @Panel.register
    def reset_broker_connection(state, **kwargs):
        state.consumer.reset_connection()
        return {'ok': 'connection re-established'}
    

    Импортировав этот модуль в worker, вы можете запустить команду с помощью celery.task.control.broadcast:

    >>> from celery.task.control import broadcast
    >>> broadcast('reset_broker_connection', reply=True)
    [{'worker1': {'ok': 'connection re-established'},
     {'worker2': {'ok': 'connection re-established'}}]
    

    TIP Вы можете выбрать работника(ов), который(ие) получит команду, используя аргумент destination:

    >>> broadcast('reset_broker_connection', destination=['worker1'])
    [{'worker1': {'ok': 'connection re-established'}]
    
  • Новая команда дистанционного управления: dump_reserved

    Сбрасывает задания, зарезервированные рабочим и ожидающие выполнения:

    >>> from celery.task.control import broadcast
    >>> broadcast('dump_reserved', reply=True)
    [{'myworker1': [<TaskRequest ....>]}]
    
  • Новая команда дистанционного управления: dump_schedule.

    Выгружает зарегистрированное в данный момент расписание ETA рабочего. Это задания с аргументом eta (или countdown), ожидающие выполнения работником.

    >>> from celery.task.control import broadcast
    >>> broadcast('dump_schedule', reply=True)
    [{'w1': []},
     {'w3': []},
     {'w2': ['0. 2010-05-12 11:06:00 pri0 <TaskRequest
                {name:'opalfeeds.tasks.refresh_feed_slice',
                 id:'95b45760-4e73-4ce8-8eac-f100aa80273a',
                 args:'(<Feeds freq_max:3600 freq_min:60
                               start:2184.0 stop:3276.0>,)',
                 kwargs:'{'page': 2}'}>']},
     {'w4': ['0. 2010-05-12 11:00:00 pri0 <TaskRequest
                {name:'opalfeeds.tasks.refresh_feed_slice',
                 id:'c053480b-58fb-422f-ae68-8d30a464edfe',
                 args:'(<Feeds freq_max:3600 freq_min:60
                               start:1092.0 stop:2184.0>,)',
                 kwargs:'{\'page\': 1}'}>',
            '1. 2010-05-12 11:12:00 pri0 <TaskRequest
                {name:'opalfeeds.tasks.refresh_feed_slice',
                 id:'ab8bc59e-6cf8-44b8-88d0-f1af57789758',
                 args:'(<Feeds freq_max:3600 freq_min:60
                               start:3276.0 stop:4365>,)',
                 kwargs:'{\'page\': 3}'}>']}]
    

Исправления

  • Поток посредника больше не блокируется более чем на 1 секунду.

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

  • Неправильно применялись ограничения удаленных тарифов (проблема #98).

  • Теперь исключения с сообщениями Unicode корректно обрабатываются в TaskRequest.on_failure.

  • Бэкенд базы данных: TaskMeta.result: значение по умолчанию должно быть None, а не пустая строка.

1.0.2

дата выхода:

2010-03-31 12:50 p.m. CET

релиз на:

Спросите Солема

  • Утратил силу: CELERY_BACKEND, вместо него используйте CELERY_RESULT_BACKEND.

  • Теперь мы используем пользовательский логгер в задачах. Этот регистратор поддерживает аргументы магического ключевого слова задачи в форматах.

    Формат по умолчанию для задач (CELERYD_TASK_LOG_FORMAT) теперь включает идентификатор и имя задачи, чтобы можно было легко отследить происхождение сообщений журнала задач.

    Пример вывода:
    [2010-03-25 13:11:20,317: INFO/PoolWorker-1]

    [tasks.add(a6e1c5ad-60d9-42a0-8b24-9e39363125a4)] Привет от add

    Чтобы вернуться к предыдущему поведению, вы можете установить:

    CELERYD_TASK_LOG_FORMAT = """
        [%(asctime)s: %(levelname)s/%(processName)s] %(message)s
    """.strip()
    
  • Юнит-тесты: Не отключать снос тестовой базы данных django, вместо этого исправлена основная проблема, которая была вызвана изменениями в настройке DATABASE_NAME (проблема #82).

  • Django Loader: Новая конфигурация CELERY_DB_REUSE_MAX (максимальное количество задач для повторного использования одного и того же соединения с базой данных)

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

    См.: http://bit.ly/94fwdd

  • рабочий: Компоненты рабочего теперь настраиваются: CELERYD_POOL, CELERYD_CONSUMER, CELERYD_MEDIATOR и CELERYD_ETA_SCHEDULER.

    По умолчанию конфигурация выглядит следующим образом:

    CELERYD_POOL = 'celery.concurrency.processes.TaskPool'
    CELERYD_MEDIATOR = 'celery.worker.controllers.Mediator'
    CELERYD_ETA_SCHEDULER = 'celery.worker.controllers.ScheduleController'
    CELERYD_CONSUMER = 'celery.worker.consumer.Consumer'
    

    Настройка CELERYD_POOL позволяет легко заменить многопроцессорный пул на многопоточный пул, или как насчет пула twisted/eventlet?

    Считайте, что конкурс на первый плагин для бассейна начался!

  • Debian init-scripts: Используйте -a, а не && (выпуск #82).

  • Debian init-scripts: Теперь всегда сохраняется $CELERYD_OPTS из /etc/default/celeryd и /etc/default/celerybeat.

  • celery.beat.Scheduler: Исправлена ошибка, при которой расписание не сбрасывалось на диск, если расписание не было правильно инициализировано.

  • celerybeat: Теперь синхронизирует расписание с диском при получении сигналов SIGTERM и << 2 >>>.

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

  • Планировщик ETA: Отсутствовал объект регистратора, поэтому планировщик падал при попытке зарегистрировать, что задание было отозвано.

  • management.commands.camqadm: Исправлена опечатка camqpadm -> camqadm (проблема #83).

  • PeriodicTask.delta_resolution: не работало для дней и часов, теперь исправлено путем округления до ближайшего дня/часа.

  • Исправлен потенциальный бесконечный цикл в BaseAsyncResult.__eq__, хотя нет никаких доказательств того, что он когда-либо был вызван.

  • рабочий: Теперь сообщения с проблемами кодировки обрабатываются путем их подтверждения и выдачи сообщения об ошибке.

1.0.1

дата выхода:

2010-02-24 07:05 p.m. CET

релиз на:

Спросите Солема

  • Задания теперь подтверждаются раньше, а не позже.

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

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

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

    Примечание

    В настоящее время ведется работа над патчем для multiprocessing, который позволит нам использовать лучшее решение и планируется к включению в релиз 2.0.0.

  • Теперь при получении сигнала SIGTERM рабочий завершает работу без ошибок.

  • Теперь рабочий выполняет холодное завершение работы, если получен сигнал SIGINT (Control-c), это означает, что он пытается завершить работу как можно быстрее.

  • Кэширование результатов теперь перенесено в базовые классы бэкенда, поэтому нет необходимости реализовывать эту функциональность в базовых классах.

  • Размер кэша теперь также ограничен, поэтому использование памяти не выходит из-под контроля.

    Вы можете установить максимальное количество результатов, которые может хранить кэш, с помощью параметра CELERY_MAX_CACHED_RESULTS (по умолчанию - пять тысяч результатов). Кроме того, вы можете повторно получить уже извлеченные результаты, используя backend.reload_task_result + backend.reload_taskset_result (это для тех, кто хочет отправлять результаты инкрементально).

  • Теперь рабочий снова работает в Windows.

    Предупреждение

    Если вы используете Celery с Django, вы не можете использовать project.settings в качестве имени модуля настроек, но следующее должно сработать:

    $ python manage.py celeryd --settings=settings
    
  • Выполнение: .messaging.TaskPublisher.send_task теперь включает в себя всю функциональность, которую ранее выполнял apply_async.

    Например, преобразование обратного отсчета в ETA, так что celery.execute.apply_async() теперь является просто удобным интерфейсом для celery.messaging.TaskPublisher.send_task(), используя параметры классов задач по умолчанию.

    Также была введена функция celery.execute.send_task(), которая может применять задачи, используя только имя задачи (полезно, если клиент не имеет целевой задачи в своем реестре задач).

    Пример:

    >>> from celery.execute import send_task
    >>> result = send_task('celery.ping', args=[], kwargs={})
    >>> result.get()
    'pong'
    
  • camqadm: Это новая утилита для доступа к AMQP API через командную строку.

    Отлично подходит для удаления очередей/связей/обменов, экспериментов и тестирования:

    $ camqadm
    1> help
    

    Вызывает интерактивную оболочку, введите help для получения списка команд.

    При использовании Django вместо этого используйте команду management:

    $ python manage.py camqadm
    1> help
    
  • Бэкенд результатов Redis: В соответствии с последними изменениями в API Redis, следующие настройки были устаревшими:

    • REDIS_TIMEOUT

    • REDIS_CONNECT_RETRY

    При их использовании будет выдано предупреждение DeprecationWarning.

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

  • Бэкенд результатов redis больше не вызывает SAVE при отключении, так как это, очевидно, лучше обрабатывается самим Redis.

  • Если включена опция settings.DEBUG, рабочий теперь предупреждает о возможной утечке памяти, к которой он может привести.

  • Планировщик ETA теперь спит не более двух секунд между итерациями.

  • Планировщик ETA теперь удаляет все отозванные задания, с которыми он может столкнуться.

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

  • Аргумент task_id теперь соблюдается, даже если задача выполняется нетерпеливо (либо с помощью apply, либо CELERY_ALWAYS_EAGER).

  • Внутренние очереди теперь очищаются при сбросе соединения.

  • Новый магический ключевой аргумент: delivery_info.

    Используется функцией retry() для повторной отправки задания в исходное место назначения с использованием того же ключа обмена/маршрутизации.

  • События: Поля не передавались .send() (исправляет ошибки ключа UUID в celerymon)

  • Добавлена опция –schedule/-s в рабочий, чтобы можно было указать пользовательское имя файла расписания при использовании встроенного сервера celerybeat (опция -B/–beat).

  • Улучшена совместимость с Python 2.4. Набор тестов теперь проходит.

  • декораторы задач: Теперь docstring сохраняется как cls.__doc__, (ранее он был скопирован в cls.run.__doc__)

  • Директория testproj была переименована в tests, и теперь мы используем nose + django-nose для обнаружения тестов, и unittest2 для тестовых случаев.

  • Новые файлы требований pip доступны в requirements.

  • TaskPublisher: Декларации теперь выполняются один раз (для каждого процесса).

  • Добавлен Task.delivery_mode и параметр CELERY_DEFAULT_DELIVERY_MODE.

    Их можно использовать для пометки сообщений как непостоянных (т.е. чтобы они терялись при перезапуске брокера).

  • Теперь у нас есть собственное исключение ImproperlyConfigured, вместо того, чтобы использовать исключение Django.

  • Улучшения в init-скриптах Debian: Показывает ошибку, если программа не является исполняемой. Не изменяет CELERYD при использовании django с virtualenv.

1.0.0

дата выхода:

2010-02-10 04:00 p.m. CET

релиз на:

Спросите Солема

Обратные несовместимые изменения

  • Celery больше не поддерживает отсоединение, поэтому вам придется использовать инструменты, доступные на вашей платформе, или что-то вроде supervisor для превращения celeryd/<< 2 >>>/<< 3 >>> в фоновые процессы.

    У нас было слишком много проблем с самопроизвольным запуском рабочего, поэтому было решено его удалить. Примеры скриптов запуска были добавлены в каталог extra/:

    • Debian, Ubuntu, (start-stop-daemon)

      extra/debian/init.d/celeryd extra/debian/init.d/celerybeat

    • macOS launchd

      extra/mac/org.celeryq.celeryd.plist extra/mac/org.celeryq.celerybeat.plist extra/mac/org.celeryq.celerymon.plist

    • Супервайзер (http://supervisord.org)

      extra/supervisord/supervisord.conf

    В дополнение к –detach, были удалены следующие аргументы программы: –uid, –gid, –workdir, –chroot, –pidfile, –umask. Все хорошие средства демонизации должны поддерживать эквивалентную функциональность, так что не беспокойтесь.

    Также были удалены следующие ключи конфигурации: CELERYD_PID_FILE, CELERYBEAT_PID_FILE, CELERYMON_PID_FILE.

  • Уровень журнала рабочего по умолчанию теперь WARN, чтобы включить предыдущий уровень журнала, запустите рабочий с –loglevel=INFO.

  • Задачи регистрируются автоматически.

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

    I

    class MyTask(Task):
        abstract = True
    

    При использовании abstract только задачи, подклассифицирующие эту задачу, будут автоматически зарегистрированы (это работает подобно Django ORM).

    I

    I

  • I

    Это изменение было добавлено, потому что оно делает внутреннюю часть гораздо более чистой и простой. Однако теперь вы можете превращать функции в задачи с помощью декоратора @task:

    from celery.decorators import task
    
    @task()
    def add(x, y):
        return x + y
    

    См.также

    <

  • Система периодических заданий была переписана на централизованное решение.

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

    Для запуска планировщика периодических задач необходимо выполнить команду celerybeat:

    $ celerybeat
    

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

    I

    $ celeryd --beat # Embed celerybeat in celeryd.
    
  • Руководитель был удален.

    Это означает, что опции -S и –supervised в celeryd больше не поддерживаются. Пожалуйста, используйте вместо них что-то вроде http://supervisord.org.

  • `

  • Статус задания «DONE» был переименован в «SUCCESS».

  • AsyncResult.is_done был удален, вместо него используйте AsyncResult.successful.

  • Рабочий больше не сохраняет ошибки, если установлено значение Task.ignore_result, для возврата к предыдущему поведению установите CELERY_STORE_ERRORS_EVEN_IF_IGNORED в True.

  • Функциональность статистики была удалена в пользу событий, поэтому переключатели -S и –statistics` были удалены.

  • Модуль celery.task.strategy был удален.

  • celery.discovery был удален, а его функция autodiscover теперь находится в celery.loaders.djangoapp. Причина: Внутренний API.

  • Переменная окружения CELERY_LOADER теперь требует имя класса загрузчика в дополнение к имени модуля,

    Например, если раньше у вас было: «celery.loaders.default», теперь вам нужен «celery.loaders.default.Loader», использование предыдущего синтаксиса приведет к появлению DeprecationWarning.

  • Определение загрузчика теперь лениво, и поэтому не выполняется при импорте celery.loaders.

    Для этого celery.loaders.settings был переименован в load_settings и теперь является функцией, возвращающей объект настроек. celery.loaders.current_loader теперь также является функцией, возвращающей текущий загрузчик.

    Итак:

    loader = current_loader
    

    необходимо изменить на:

    loader = current_loader()
    

Амортизация

  • Следующие переменные конфигурации были переименованы и будут устаревшими в версии 2.0:

    • CELERYD_DAEMON_LOG_FORMAT -> CELERYD_LOG_FORMAT

    • CELERYD_DAEMON_LOG_LEVEL -> CELERYD_LOG_LEVEL

    • CELERY_AMQP_CONNECTION_TIMEOUT -> CELERY_BROKER_CONNECTION_TIMEOUT

    • CELERY_AMQP_CONNECTION_RETRY -> CELERY_BROKER_CONNECTION_RETRY

    • CELERY_AMQP_CONNECTION_MAX_RETRIES -> CELERY_BROKER_CONNECTION_MAX_RETRIES

    • SEND_CELERY_TASK_ERROR_EMAILS -> CELERY_SEND_TASK_ERROR_EMAILS

  • Имена публичных API в celery.conf также были изменены на согласованную схему именования.

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

    Для этого нам пришлось переименовать синтаксис конфигурации. Если вы используете какие-либо из пользовательских опций маршрутизации AMQP (queue/exchange/routing_key и т.д.), вам следует прочитать новую запись в FAQ: Можно ли отправлять некоторые задания только на некоторые серверы?.

    Предыдущий синтаксис устарел и планируется к удалению в версии 2.0.

  • TaskSet.run был переименован в TaskSet.apply_async.

    Функция TaskSet.run уже устарела и планируется к удалению в версии 2.0.

Новости

  • Поддержка ограничения скорости (для каждого типа задач или глобально).

  • Новая система периодических заданий.

  • Автоматическая регистрация.

  • Новый синтаксис декоратора задач.

  • worker: теперь отправляет события, если это разрешено с помощью аргумента -E.

    Отличный инструмент для мониторинга, один из них уже находится в разработке (https://github.com/celery/celerymon).

    Текущие события включают: worker-heartbeat, task-[received/succeeded/failed/retried], worker-online, worker-offline.

  • Теперь вы можете удалять (отзывать) задания, которые уже были применены.

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

  • Кэш-бэкенд теперь учитывает настройку CELERY_TASK_RESULT_EXPIRES.

  • Формат сообщений был стандартизирован и теперь использует формат ISO-8601 для дат вместо datetime.

  • теперь рабочий отвечает на сигнал SIGHUP перезапуском.

  • Периодические задания теперь планируются по часам.

    То есть timedelta(hours=1) означает каждый час в :00 минут, а не каждый час с момента запуска сервера. Чтобы вернуться к предыдущему поведению, вы можете установить PeriodicTask.relative = True.

  • Теперь поддерживается передача опций выполнения в список аргументов TaskSets.

    Пример:

    >>> ts = TaskSet(add, [([2, 2], {}, {'countdown': 1}),
    ...                    ([4, 4], {}, {'countdown': 2}),
    ...                    ([8, 8], {}, {'countdown': 3})])
    >>> ts.run()
    
  • Получили 3-кратный прирост производительности, установив счетчик prefetch в четыре раза больше параллелизма (со среднего времени обхода задачи 0,1 с до 0,03 с!).

    Добавлена новая настройка: CELERYD_PREFETCH_MULTIPLIER, который по умолчанию установлен на 4.

  • Улучшена поддержка задач webhook.

    celery.task.rest теперь устарел и заменен новым и блестящим celery.task.http. С более отражающими именами, разумным интерфейсом и возможностью переопределения методов, используемых для выполнения HTTP-запросов.

  • Результаты наборов задач теперь кэшируются путем хранения в бэкенде результатов.

Изменения

  • Теперь зависит от carrot >= 0.8.1

  • Новые зависимости: billiard, python-dateutil, django-picklefield.

  • Больше не зависит от python-daemon

  • Дистрибутив uuid добавляется в качестве зависимости при запуске Python 2.4.

  • Теперь запомните ранее обнаруженный загрузчик, сохранив его в переменной окружения CELERY_LOADER.

    Это может помочь в windows, где используется эмуляция вилки.

  • ETA больше не отправляет объекты datetime, а использует формат даты ISO 8601 в строке для лучшей совместимости с другими платформами.

  • Больше не отправляет сообщения об ошибках при повторном выполнении заданий.

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

  • Переработана обёртка ExecuteWrapper, apply и CELERY_ALWAYS_EAGER теперь также выполняют обратные вызовы и сигналы задачи.

  • Теперь использую подходящий планировщик для задач с ETA.

    Это означает, что ожидающие ETA задачи сортируются по времени, поэтому нам не нужно постоянно опрашивать весь список.

  • Теперь также импортирует модули, перечисленные в CELERY_IMPORTS при запуске с django (согласно документации).

  • Уровень журнала для stdout/stderr изменен с INFO на ERROR

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

  • Теперь вы можете использовать celery.messaging.establish_connection для установления соединения с брокером.

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

    Если вам нужно более быстрое время опроса, вы можете уменьшить значение CELERYBEAT_MAX_LOOP_INTERVAL.

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

  • Рабочий теперь поддерживает команды управления, включенные с помощью широковещательной очереди, вы можете удаленно отзывать задания или устанавливать ограничение скорости для типа задания. См. celery.task.control.

  • Службы теперь устанавливают информативные имена процессов (как показано в списках ps), если установлен модуль setproctitle.

  • NotRegistered теперь наследуется от KeyError, и TaskRegistry.__getitem__`+`pop поднимает NotRegistered вместо этого

  • Вы можете установить загрузчик через переменную окружения CELERY_LOADER.

  • Теперь вы можете установить CELERY_IGNORE_RESULT для игнорирования результатов задач по умолчанию (если это включено, задачи не сохраняют результаты или ошибки в используемом бэкенде).

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

Жучки

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

Документация

  • Ссылки теперь разделены на два раздела: ссылки на API и ссылки на внутренние модули.

0.8.4

дата выхода:

2010-02-05 01:52 p.m. CEST

релиз на:

Спросите Солема

  • Теперь выдает предупреждение, если используется аргумент –detach. –detach больше не следует использовать, так как он имеет несколько нелегко исправляемых ошибок, связанных с ним. Вместо этого используйте что-то вроде start-stop-daemon, supervisor или launchd (macOS).

  • Убедитесь, что класс регистратора знает процесс, даже если используется Python >= 2.6.

  • Письма об ошибках больше не отправляются при повторной попытке выполнения задания.

0.8.3

дата выхода:

2009-12-22 09:43 a.m. CEST

релиз на:

Спросите Солема

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

  • Теперь имеет точки входа консольного скрипта в файле setup.py, поэтому инструменты типа zc.buildout будут корректно устанавливать программы celeryd и celeryinit.

0.8.2

дата выхода:

2009-11-20 03:40 p.m. CEST

релиз на:

Спросите Солема

  • QOS Prefetch count применялся неправильно, так как он устанавливался для каждого полученного сообщения (что, очевидно, ведет себя как «получить еще одно»), вместо того, чтобы устанавливаться только при изменении желаемого значения.

0.8.1

дата выхода:

2009-11-16 05:21 p.m. CEST

релиз на:

Спросите Солема

Очень важное замечание

Этот релиз (с carrot 0.8.0) включает AMQP QoS (качество обслуживания), что означает, что рабочие будут получать только столько сообщений, сколько они могут обработать за один раз. Как и в случае с любым другим релизом, вы должны протестировать обновление этой версии на своих серверах разработки, прежде чем выкладывать его в продакшн!

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

  • Если вы используете Python < 2.6 и используете бэкпорт мультипроцессинга, то требуется мультипроцессинг версии 2.6.2.1.

  • Все настройки AMQP_* были переименованы в BROKER_*, а также AMQP_SERVER был переименован в BROKER_HOST, так что раньше там, где у вас было:

    AMQP_SERVER = 'localhost'
    AMQP_PORT = 5678
    AMQP_USER = 'myuser'
    AMQP_PASSWORD = 'mypassword'
    AMQP_VHOST = 'celery'
    

    Вам нужно изменить это на:

    BROKER_HOST = 'localhost'
    BROKER_PORT = 5678
    BROKER_USER = 'myuser'
    BROKER_PASSWORD = 'mypassword'
    BROKER_VHOST = 'celery'
    
  • Пользовательские бэкенды carrot теперь должны включать в себя имя класса бэкенда, так что раньше у вас было:

    CARROT_BACKEND = 'mycustom.backend.module'
    

    вам нужно изменить его на:

    CARROT_BACKEND = 'mycustom.backend.module.Backend'
    

    где Backend - имя класса. Вероятно, это «Backend», так как это было ранее подразумеваемое имя.

  • Новые требования к версии для моркови: 0.8.0

Изменения

  • Включен патч backport мультипроцессинга, исправляющий ошибку processName.

  • По умолчанию игнорирует результат выполнения PeriodicTask’ов.

  • Добавлен бэкенд хранилища результатов Redis

  • Позволяет /etc/default/celeryd определять дополнительные опции для celeryd init-скрипта.

  • Исправлена проблема периодических задач MongoDB при использовании времени, отличного от UTC.

  • Специфика Windows: Отмените проверку на доступность os.fork (спасибо @miracle2k).

  • Теперь попытался обработать сломанные файлы PID.

  • В contrib добавлен бегунок тестирования Django, который устанавливает CELERY_ALWAYS_EAGER = True для тестирования с бэкендом базы данных.

  • Добавлена настройка CELERY_CACHE_BACKEND для использования чего-то другого, кроме бэкенда Django-global cache.

  • Используйте пользовательскую реализацию functools.partial для поддержки Python 2.4 (Вероятно, все еще есть проблемы с запуском на 2.4, но со временем она будет поддерживаться).

  • Подготовьте исключение для pickle при сохранении статуса RETRY для всех бэкендов.

  • SQLite no concurrency limit должен действовать только при использовании бэкенда базы данных.

0.8.0

дата выхода:

2009-09-22 03:06 p.m. CEST

релиз на:

Спросите Солема

Обратные несовместимые изменения

  • Добавьте трассировку к значению результата при неудаче.

    Примечание

    Если вы используете бэкенд базы данных, вам необходимо заново создать таблицу базы данных celery_taskmeta.

    Обратитесь за помощью по каналу Список рассылки или << 1 >>>.

  • Таблицы базы данных теперь создаются только при использовании бэкенда базы данных, поэтому если вы в какой-то момент перейдете на бэкенд базы данных, не забудьте инициализировать таблицы (django: syncdb, python: celeryinit).

    Примечание

    Это применимо только при использовании Django версии 1.1 или выше.

  • Теперь зависит от carrot версии 0.6.0.

  • Теперь зависит от python-daemon 1.4.8

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

  • Теперь Celery можно использовать в чистом Python (вне проекта Django).

    Это означает, что Celery больше не является специфичным для Django.

    Для получения дополнительной информации см. запись FAQ Является ли Celery только для Django?.

  • Celery теперь поддерживает повторные попытки выполнения задач.

    Дополнительную информацию см. в разделе Повторная попытка.

  • Теперь у нас есть бэкенд хранилища результатов AMQP.

    Он использует сообщения для публикации возвращаемого значения и статуса задачи. И это невероятно быстро!

    Смотрите выпуск #6 для получения дополнительной информации!

  • Реализовано AMQP QoS (подсчет префетчей):

    Это необходимо для того, чтобы не получать больше сообщений, чем мы можем обработать.

  • Теперь при отсоединении перенаправляет stdout/stderr в рабочий файл журнала

  • Теперь используется inspect.getargspec для передачи только аргументов по умолчанию

    задача поддерживает.

  • Добавьте обработчики Task.on_success, .on_retry, .on_failure
    См. celery.task.base.Task.on_success(),

    celery.task.base.Task.on_retry(), celery.task.base.Task.on_failure(),

  • celery.utils.gen_unique_id: Обходной путь для

    http://bugs.python.org/issue4607

  • Теперь вы можете настроить, что происходит при запуске рабочего, при инициализации процесса и т.д.,

    путем создания собственных загрузчиков (см. celery.loaders.default, celery.loaders.djangoapp, celery.loaders).

  • Поддержка нескольких обменов и очередей AMQP.

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

  • Теперь рабочий выживает после перезапуска AMQP-сервера!

    Автоматическое восстановление соединения с брокером AMQP в случае его потери.

    Новые настройки:

    • AMQP_CONNECTION_RETRY

      Установите значение True, чтобы включить повторные попытки соединения.

    • AMQP_CONNECTION_MAX_RETRIES.

      Максимальное количество перезапусков перед тем, как мы сдадимся. По умолчанию: 100.

Новости

  • Исправьте несовместимость между python-daemon и многопроцессорностью,

    что приводило к проблеме [Errno 10] No child processes при отсоединении.

  • Исправлена возможная ошибка DjangoUnicodeDecodeError при сохранении маринованных файлов

    данные в бэкенд кэша Django`s Memcached.

  • Улучшенная совместимость с Windows.

  • Новая версия маринованного поля (взято из

    http://www.djangosnippets.org/snippets/513/)

  • Введены новые сигналы: task_sent, task_prerun и

    task_postrun, более подробную информацию смотрите в celery.signals.

  • TaskSetResult.join вызвал TypeError, когда timeout=None.

    Спасибо Ежи Козера. Закрывается #31

  • views.apply должен возвращать экземпляр HttpResponse.

    Спасибо Ежи Козера. Закрывается #32

  • PeriodicTask: Сохраните преобразование run_every из int.

    на timedelta в атрибут класса, а не на экземпляр.

  • Исключения были перенесены в celery.exceptions, но все еще являются

    имеющиеся в предыдущем модуле.

  • Попытайтесь откатить транзакцию и повторить сохранение результата, если произошла ошибка

    при установке статуса задачи с помощью бэкенда базы данных.

  • jail() переделан в celery.execute.ExecuteWrapper.

  • views.apply теперь правильно устанавливает mime-type в «application/json».

  • views.task_status теперь возвращает исключение, если состояние RETRY

  • views.task_status теперь возвращает traceback, если состояние FAILURE

    или RETRY

  • Документированные аргументы задачи по умолчанию.

  • Добавьте разумный __repr__ к ExceptionInfo для облегчения отладки

  • Исправьте опечатку в документации …import map -> …import dmap.

    Благодаря @mikedizon.

0.6.0

дата выхода:

2009-08-07 06:54 a.m. CET

релиз на:

Спросите Солема

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

  • Исправлена ошибка, при которой задания, вызывающие нерасщепляемые исключения, приводили к сбою пула

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

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

  • Пул задач теперь находится под контролем, поэтому в случае сбоя работника пула,

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

  • Task.name теперь автоматически генерируется из class module+name, например «djangotwitter.tasks.UpdateStatusesTask». Очень удобно. Не знаю, почему мы не сделали этого раньше. Обновлена документация, чтобы не указывать имя задачи вручную.

Новости

  • Протестировано с Django 1.1

  • Новый учебник: Создание счетчика кликов с помощью Carrot и Celery

  • Записи в базе данных для периодических заданий теперь создаются в рабочих

    запуск вместо каждой проверки (что уже давно является забытым TODO/XXX в коде)

  • Новая переменная настроек: CELERY_TASK_RESULT_EXPIRES

    Время (в секундах, или объект datetime.timedelta), когда после сохранения результатов задачи будут удалены. На данный момент это работает только для бэкенда базы данных.

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

    был запущен.

  • Таблица периодических задач теперь заблокирована для чтения при получении

    периодический статус задач (пока только MySQL, ищутся патчи для других движков)

  • Гораздо больше отладочной информации теперь доступно при включении функции

    Уровень журнала DEBUG (–loglevel=DEBUG).

  • Функции/методы с аргументом таймаута теперь работают корректно.

  • Новое: celery.strategy.even_time_distribution:

    С помощью итератора, выдающего кортежи task args, kwargs, равномерно распределить обработку своих задач по всему доступному временному окну.

  • Сообщение журнала Неизвестная задача проигнорирована… теперь имеет уровень журнала ERROR.

  • Сообщение в журнале о получении задания теперь выдается для всех заданий, даже если

    задача имеет ETA (расчетное время прибытия). Также сообщение журнала теперь включает ETA для задачи (если таковая имеется).

  • Подтверждение теперь происходит в обратном вызове пула. Невозможно выполнить подтверждение в задании

    цель, так как она не является pickleable (не может разделять AMQP соединение и т.д.).

  • Добавлена заметка о зависании .delay в README

  • Тесты теперь проходят в Django 1.1

  • Исправлено обнаружение, чтобы убедиться, что приложение находится в INSTALLED_APPS

  • Ранее переопределенное поведение пула (обрабатывать жатву, ждать, пока работник пула

    доступны и т.д.) теперь обрабатывается самим multiprocessing.Pool.

  • Преобразуйте данные статистики в Unicode для использования в качестве kwargs. Спасибо Люси!

0.4.1

дата выхода:

2009-07-02 01:42 p.m. CET

релиз на:

Спросите Солема

  • Исправлена ошибка с разбором опций сообщения (обязательный, ключ_маршрутизации, приоритет, посредственный).

0.4.0

дата выхода:

2009-07-01 07:29 p.m. CET

релиз на:

Спросите Солема

  • Добавляет нетерпеливое выполнение. celery.execute.apply`|`Task.apply выполняет функцию, блокируя ее до завершения задачи, для совместимости с API возвращает экземпляр celery.result.EagerResult. Вы можете настроить Celery на всегда локальный запуск задач, установив параметр CELERY_ALWAYS_EAGER> в True.

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

  • 99% покрытие с помощью Python coverage 3.0.

0.3.20

дата выхода:

2009-06-25 08:42 p.m. CET

релиз на:

Спросите Солема

  • Новые аргументы для apply_async (расширенная версия delay_task), countdown и eta;

    >>> # Run 10 seconds into the future.
    >>> res = apply_async(MyTask, countdown=10);
    
    >>> # Run 1 day from now
    >>> res = apply_async(MyTask,
    ...                   eta=datetime.now() + timedelta(days=1))
    
  • Теперь отсоединяет устаревшие файлы PID

  • Множество других тестов.

  • Теперь совместим с carrot >= 0.5.0.

  • ВАЖНО Атрибут subtask_ids на экземпляре TaskSetResult был удален. Для получения этой информации вместо него используйте:

    >>> subtask_ids = [subtask.id for subtask in ts_res.subtasks]
    
  • Taskset.run() теперь учитывает дополнительные параметры сообщения из класса задачи.

  • Задача: Добавьте атрибут ignore_result: Не храните статус и возвращаемое значение. Это означает, что вы не сможете использовать celery.result.AsyncResult для проверки выполнения задачи или получения ее возвращаемого значения. Используйте только в том случае, если вам нужна производительность и вы можете жить без этих функций. Любые возникающие исключения будут хранить возвращаемое значение/статус, как обычно.

  • Задача: Добавьте атрибут disable_error_emails, чтобы отключить отправку писем об ошибках для этой задачи.

  • Теперь должно работать под Windows (хотя запуск в фоновом режиме не будет работать, поэтому использование аргумента –detach приводит к возникновению исключения).

  • Добавлена поддержка статистики для профилирования и мониторинга. Чтобы начать отправку статистики, запустите рабочий с опцией –statistics. Затем через некоторое время вы можете сбросить результаты, запустив python manage.py celerystats. Более подробную информацию смотрите в разделе celery.monitoring.

  • Демон Celery теперь может быть контролируемым (т.е. автоматически перезапускаться в случае сбоя). Чтобы использовать это, запустите рабочий с опцией –supervised` (или альтернативно -S).

  • views.apply: Вид, вызывающий задачу.

    Пример:

    http://e.com/celery/apply/task_name/arg1/arg2//?kwarg1=a&kwarg2=b
    

    Предупреждение

    Используйте с осторожностью! Не выкладывайте этот URL в открытый доступ, не убедившись предварительно в безопасности своего кода!

  • Рефакторинг celery.task. Теперь он разделен на три модуля:

    • celery.task

      Содержит apply_async, delay_task, discard_all и ярлыки задач, а также импортирует объекты из celery.task.base и celery.task.builtins.

    • celery.task.base

      Содержит базовые классы задач: Task, PeriodicTask, TaskSet, AsynchronousMapTask, ExecuteRemoteTask.

    • celery.task.builtins

      Встроенные задачи: PingTask, DeleteExpiredTaskMetaTask.

0.3.7

дата выхода:

2008-06-16 11:41 p.m. CET

релиз на:

Спросите Солема

  • ** ВАЖНО** Теперь используется AMQP basic.consume вместо basic.get. Это означает, что мы больше не опрашиваем брокер на предмет новых сообщений.

  • ** ВАЖНО** Ограничение параллелизма по умолчанию теперь устанавливается в соответствии с количеством CPU, доступных в системе.

  • ВАЖНО tasks.register: Переименовали аргумент task_name в name, так что:

    >>> tasks.register(func, task_name='mytask')
    

    должен быть заменен на:

    >>> tasks.register(func, name='mytask')
    
  • Теперь демон корректно запускается, если pid-файл устарел.

  • Теперь совместим с carrot 0.4.5

  • Таймаут соединения AMQP по умолчанию теперь составляет 4 секунды.

  • AsyncResult.read() всегда возвращало True.

  • Используйте README в качестве long_description, только если файл существует, чтобы easy_install не сломался.

  • celery.view: Ответы JSON теперь правильно устанавливают свой mime-type.

  • У apply_async теперь есть ключевой аргумент connection, так что вы можете повторно использовать одно и то же AMQP-соединение, если хотите выполнить более одной задачи.

  • Обрабатывайте сбои в представлении task_status так, чтобы оно не выбрасывало 500s.

  • Исправлена опечатка AMQP_SERVER в документации на AMQP_HOST.

  • Письма с исключениями для работников, отправленные администраторам, теперь работают правильно.

  • Больше не зависит от django, поэтому установка celery не повлияет на предпочтительную установленную версию Django.

  • Теперь снова работает с PostgreSQL (psycopg2), регистрируя поле PickledObject.

  • Worker: Добавлена опция –detach в качестве псевдонима для –daemon, и отныне в документации используется именно этот термин.

  • Убедитесь, что пул и рабочий поток периодических задач правильно завершается при выходе (так что Control-c снова работает).

  • Теперь зависит от python-daemon.

  • Удалена зависимость от simplejson.

  • Cache Backend: Повторно устанавливает соединение для каждого процесса задачи, если Django cache backend имеет значение python-memcached/libmemcached.

  • Tyrant Backend: Теперь восстанавливает соединение для каждой выполненной задачи.

0.3.3

дата выхода:

2009-06-08 01:07 p.m. CET

релиз на:

Спросите Солема

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

0.3.2

дата выхода:

2009-06-08 01:07 p.m. CET

релиз на:

Спросите Солема

  • рабочий: Добавлена опция –discard: Отбрасывать (удалять!) все ожидающие сообщения в очереди.

  • Рабочий: Опция –wakeup-after не обрабатывалась как плавающая.

0.3.1

дата выхода:

2009-06-08 01:07 p.m. CET

релиз на:

Спросите Солема

  • Рабочий PeriodicTask теперь выполняется в собственном потоке, а не блокирует цикл TaskController.

  • Значение по умолчанию QUEUE_WAKEUP_AFTER было снижено до 0.1 (было 0.3).

0.3.0

дата выхода:

2009-06-08 12:41 p.m. CET

релиз на:

Спросите Солема

Предупреждение

Это версия для разработки, для стабильного выпуска, пожалуйста, смотрите версии 0.2.x.

ОЧЕНЬ ВАЖНО: Pickle теперь является кодировщиком, используемым для сериализации аргументов задачи, поэтому не забудьте промыть очередь задач перед обновлением.

  • ВАЖНО TaskSet.run() теперь возвращает экземпляр celery.result.TaskSetResult, что позволяет вам проверять статус и возвращаемые значения набора задач, как если бы он был единым целым.

  • IMPORTANT Celery теперь зависит от carrot >= 0.4.1.

  • Демон Celery теперь отправляет ошибки задач на зарегистрированную электронную почту администратора. Чтобы отключить эту возможность, установите SEND_CELERY_TASK_ERROR_EMAILS в False в вашем settings.py. Спасибо Грегуару Каше.

  • Теперь вы можете запустить демон Celery с помощью manage.py:

    $ python manage.py celeryd
    

    Спасибо Грегуару Каше.

  • Добавлена поддержка приоритетов сообщений, обмена темами, пользовательских ключей маршрутизации для задач. Введен celery.task.apply_async, новый способ выполнения задач.

    Вы можете использовать celery.task.delay и celery.Task.delay как обычно, но если вы хотите большего контроля над отправляемым сообщением, вам нужны celery.task.apply_async и celery.Task.apply_async.

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

    • CELERY_AMQP_EXCHANGE

    • CELERY_AMQP_PUBLISHER_ROUTING_KEY

    • CELERY_AMQP_CONSUMER_ROUTING_KEY

    • CELERY_AMQP_CONSUMER_QUEUE

    • CELERY_AMQP_EXCHANGE_TYPE

    См. запись Можно ли отправлять некоторые задания только на некоторые серверы? в FAQ для получения дополнительной информации.

  • Ошибки задач теперь регистрируются с использованием уровня журнала ERROR вместо INFO, а стек-трассировки сбрасываются. Спасибо Грегуару Каше.

  • Заставить каждый новый рабочий процесс заново устанавливать соединение с Django DB, что устраняет исключения «MySQL connection died?». Спасибо Виталию Бабию и Йирке Вейразке.

  • ВАЖНО Теперь для кодирования аргументов задач используется pickle. Это означает, что теперь вы можете передавать сложные объекты Python задачам в качестве аргументов.

  • Удалена зависимость от yadayada.

  • Добавлен FAQ, см. docs/faq.rst.

  • Теперь преобразует любые ключи Unicode в задании kwargs в обычные строки. Спасибо Виталию Бабий.

  • Переименовали TaskDaemon в WorkController.

  • celery.datastructures.TaskProcessQueue теперь переименован в celery.pool.TaskPool.

  • Алгоритм пула был переработан для повышения производительности и стабильности.

0.2.0

дата выхода:

2009-05-20 05:14 p.m. CET

релиз на:

Спросите Солема

  • Окончательный выпуск 0.2.0

  • Совместим с версией моркови 0.4.0.

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

0.2.0-pre3

дата выхода:

2009-05-20 05:14 p.m. CET

релиз на:

Спросите Солема

  • Внутренний релиз. Улучшена обработка нерасщепляемых исключений, get_result теперь пытается воссоздать что-то похожее на исходное исключение.

0.2.0-pre2

дата выхода:

2009-05-20 01:56 p.m. CET

релиз на:

Спросите Солема

  • Теперь обрабатывает неподбираемые исключения (например, динамически создаваемые подклассы django.core.exception.MultipleObjectsReturned).

0.2.0-pre1

дата выхода:

2009-05-20 12:33 p.m. CET

релиз на:

Спросите Солема

  • Он становится довольно стабильным, с большим количеством новых возможностей, так что повышаем версию до 0.2. Это предварительная версия.

  • celery.task.mark_as_read() и celery.task.mark_as_failure() были удалены. Вместо них используйте celery.backends.default_backend.mark_as_read() и celery.backends.default_backend.mark_as_failure().

0.1.15

дата выхода:

2009-05-19 04:13 p.m. CET

релиз на:

Спросите Солема

  • Демон Celery пропускал AMQP-соединения, это должно быть исправлено, если у вас возникли проблемы со слишком большим количеством открытых файлов (например, ошибки emfile в rabbit.log), пожалуйста, свяжитесь с нами!

0.1.14

дата выхода:

2009-05-19 01:08 p.m. CET

релиз на:

Спросите Солема

  • Исправлена синтаксическая ошибка в классе TaskSet (не было такой переменной TimeOutError).

0.1.13

дата выхода:

2009-05-19 12:36 p.m. CET

релиз на:

Спросите Солема

  • Забыли добавить yadayada в требования к установке.

  • Теперь удаляются все просроченные результаты задач, а не только те, которые помечены как выполненные.

  • Возможность загрузки класса Tokyo Tyrant backend без конфигурации django, можно указать настройки tyrant непосредственно в конструкторе класса.

  • Улучшенная документация по API

  • Теперь, используя систему документации Sphinx, вы можете создать html-документацию, выполнив следующие действия:

    $ cd docs
    $ make html
    

    и результат будет находиться в docs/_build/html.

0.1.12

дата выхода:

2009-05-18 04:38 p.m. CET

релиз на:

Спросите Солема

  • delay_task() и т.д. теперь возвращает объект celery.task.AsyncResult, который позволяет вам проверить результат и любой сбой, который мог произойти. Он работает как класс multiprocessing.AsyncResult, возвращаемый multiprocessing.Pool.map_async.

  • Добавлены dmap() и dmap_async(). Это работает как версии multiprocessing.Pool, за исключением того, что задачи распределяются на сервер Celery. Пример:

    >>> from celery.task import dmap
    >>> import operator
    >>> dmap(operator.add, [[2, 2], [4, 4], [8, 8]])
    >>> [4, 8, 16]
    
    >>> from celery.task import dmap_async
    >>> import operator
    >>> result = dmap_async(operator.add, [[2, 2], [4, 4], [8, 8]])
    >>> result.ready()
    False
    >>> time.sleep(1)
    >>> result.ready()
    True
    >>> result.result
    [4, 8, 16]
    
  • Переработаны бэкенды кэша мета-данных задач и базы данных, а также добавлен новый бэкенд для Tokyo Tyrant. Вы можете установить бэкенд в файле настроек django.

    Пример:

    CELERY_RESULT_BACKEND = 'database'; # Uses the database
    CELERY_RESULT_BACKEND = 'cache'; # Uses the django cache framework
    CELERY_RESULT_BACKEND = 'tyrant'; # Uses Tokyo Tyrant
    TT_HOST = 'localhost'; # Hostname for the Tokyo Tyrant server.
    TT_PORT = 6657; # Port of the Tokyo Tyrant server.
    

0.1.11

дата выхода:

2009-05-12 02:08 p.m. CET

релиз на:

Спросите Солема

  • В системе регистрации происходила утечка дескрипторов файлов, что приводило к остановке серверов с ошибкой EMFILES (слишком много открытых файлов) (исправлено).

0.1.10

дата выхода:

2009-05-11 12:46 p.m. CET

релиз на:

Спросите Солема

  • Задачи теперь поддерживают как позиционные аргументы, так и аргументы в виде ключевых слов.

  • Требуется carrot 0.3.8.

  • Теперь демон пытается переподключиться, если соединение потеряно.

0.1.8

дата выхода:

2009-05-07 12:27 p.m. CET

релиз на:

Спросите Солема

  • Лучшее покрытие тестов

  • Дополнительная документация

  • Рабочий не выдает сообщение Queue is empty, если settings.CELERYD_EMPTY_MSG_EMIT_EVERY равно 0.

0.1.7

дата выхода:

2009-04-30 01:50 p.m. CET

релиз на:

Спросите Солема

  • Добавлены некоторые модульные тесты

  • Теперь можно использовать базу данных для мета-данных задачи (например, была ли задача выполнена или нет). Установите settings.CELERY_TASK_META.

  • Теперь можно запустить python setup.py test для запуска модульных тестов из проекта tests.

  • Можно установить ключ AMQP-обмена/маршрутизации/квеста с помощью settings.CELERY_AMQP_EXCHANGE, settings.CELERY_AMQP_ROUTING_KEY и settings.CELERY_AMQP_CONSUMER_QUEUE.

0.1.6

дата выхода:

2009-04-28 02:13 p.m. CET

релиз на:

Спросите Солема

  • Представляем вашему вниманию TaskSet. Набор подзадач выполняется, и вы можете узнать, сколько из них или все ли они выполнены (отлично подходит для прогресс-баров и т.п.)

  • Теперь перехватываются все исключения при выполнении Task.__call__, так что демон не умирает. Это пока не происходит для чистых функций, только для классов Task.

  • Функция autodiscover() теперь работает с застегнутыми яйцами.

  • Worker: Теперь для удобства добавляет текущий рабочий каталог в sys.path.

  • Атрибут run_every классов PeriodicTask теперь может быть объектом datetime.timedelta().

  • Рабочий: Теперь вы можете задать переменную DJANGO_PROJECT_DIR для рабочего, и он добавит ее в sys.path для легкого запуска.

  • Теперь можно проверить, была ли задача выполнена или нет, через HTTP.

  • Вы можете сделать это, включив в свой проект Celery urls.py,

    >>> url(r'^celery/$', include('celery.urls'))
    

    затем посетите следующий URL-адрес:

    http://mysite/celery/$task_id/done/
    

    это вернет словарь JSON, например:

    {"task": {"id": "TASK_ID", "executed": true}}
    
  • delay_task теперь возвращает строковый id, а не экземпляр uuid.UUID.

  • Теперь имеет PeriodicTasks, чтобы иметь функциональность, подобную cron.

  • Проект изменил название с crunchy на celery. Подробности запроса на изменение имени находятся в файле docs/name_change_request.txt.

0.1.0

дата выхода:

2009-04-24 11:28 a.m. CET

релиз на:

Спросите Солема

  • Первоначальный выпуск

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

../../_images/celery-banner.png ../../_images/celery-banner-small.png
Вернуться на верх