Celery 2.5 的新特性 — Python 文档

来自菜鸟教程
Celery/docs/latest/history/whatsnew-2.5
跳转至:导航、​搜索

Celery 2.5 的新功能

Celery 旨在成为一种灵活、可靠、同类最佳的解决方案,以分布式方式处理大量消息,同时为操作人员提供维护此类系统的工具。

Celery 拥有庞大而多样化的用户和贡献者社区,您应该在 IRC 我们的邮件列表 上加入我们 。

要了解有关 Celery 的更多信息,您应该访问我们的 网站

虽然此版本向后兼容以前的版本,但阅读以下部分很重要。

如果您将 Celery 与 Django 结合使用,您还必须阅读 django-celery 更新日志并升级到 :pypi:`django-celery 2.5 ` .

此版本在 CPython 2.5、2.6、2.7、3.2 和 3.3 以及 PyPy 和 Jython 上得到官方支持。

重要说明

现在默认启用代理连接池

默认限制是 10 个连接,如果您有许多线程/绿色线程同时使用连接,您可能需要调整此限制以避免争用。

有关更多信息,请参阅 :setting:`BROKER_POOL_LIMIT` 设置。

另请注意,发布任务将默认重试,要更改此默认值或默认重试策略,请参阅 :setting:`CELERY_TASK_PUBLISH_RETRY`:setting:`CELERY_TASK_PUBLISH_RETRY_POLICY`


Rabbit 结果后端:Exchange 不再是 自动删除

在 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 池的用户使用此设置,但特别是还使用时间限制或每个子项设置的最大任务数的用户。

  • 请参阅 Python 问题 6721 以了解有关此问题的更多信息,以及为什么诉诸 execv`() 是唯一安全的解决方案。

启用此选项会在启动新的子工作进程时导致轻微的性能损失,并且还会增加内存使用量(但许多平台已优化,因此影响可能很小)。 考虑到它在替换丢失的工作进程时确保可靠性,应该是值得的。

  • 这已经是 Windows 上的默认行为。
  • 这将是未来版本中所有平台的默认行为。


优化

  • worker 执行任务时使用的代码路径已经过大量优化,这意味着与以前的版本相比,worker 每秒能够处理更多的任务。 例如,当使用 :pypi:`pylibrabbitmq` 传输时,单池现在可以在 4 核 MacBook Pro 上处理高达 15000 个任务/秒,而以前它只能处理 5000 个任务/秒。
  • 任务错误回溯现在要短得多。
  • 修复了启用速率限制时任务处理的明显延迟。


弃用时间线更改

移除

  • 旧的 TaskSet 签名 (task_name, list_of_tasks) 不能再使用(原定于 2.4 移除)。 已弃用的 .task_name.task 属性也已被删除。
  • 功能 celery.execute.delay_taskcelery.execute.applycelery.execute.apply_async 已被删除(最初)计划在 2.3 中删除。
  • 内置的 ping 任务已被移除(原定于 2.3 中移除)。 请改用 ping 广播命令。
  • 不再可能从 celery.task.base 导入 subtaskTaskSet,请改为从 celery.task 导入(原定于 2.4 中移除)。


弃用的模块

  • celery.decorators 模块已从待弃用状态更改为弃用,并计划在 4.0 版中移除。 必须改用 celery.task 模块。


新闻

时区支持

Celery 现在可以配置为将所有传入和传出日期视为 UTC,并且可以配置本地时区。

这在默认情况下尚未启用,因为启用时区支持意味着运行 2.5 之前版本的工作人员将与升级后的工作人员不同步。

要启用 UTC,您必须设置 :setting:`CELERY_ENABLE_UTC`

CELERY_ENABLE_UTC = True

启用 UTC 时,任务消息中的日期和时间将转换为 UTC,然后在工作人员收到时转换回本地时区。

您可以使用 :setting:`CELERY_TIMEZONE` 设置更改本地时区。 建议在使用自定义时区时安装 :pypi:`pytz` 库,以保持时区定义最新,但如果可用,它将回退到时区的系统定义。

UTC 将在 3.0 版中默认启用。

笔记

:pypi:`django-celery` 将使用由 TIME_ZONE 设置指定的本地时区,它还将遵循 Django 1.4 中引入的新 USE_TZ 设置。


使用加密签名的新安全序列化程序

添加了一个新的序列化程序,用于对消息签名进行签名和验证。

新序列化程序的名称是 auth,需要额外的配置才能工作(参见 Security)。

也可以看看

安全


由 Mher Movsisyan 提供。


新增 :setting:`CELERY_ANNOTATIONS` 设置

此新设置使配置能够修改任务类及其属性。

该设置可以是一个字典,也可以是一个注释对象列表,用于过滤任务并返回要更改的属性映射。

例如,这是更改 tasks.add 任务的 rate_limit 属性的注释:

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)),这将不起作用。 为此,必须使用 applyupdate_twitter_status.apply((a, b))


在其他新闻中

  • 现在取决于 Kombu 2.1.0。

  • 对 Memcached 后端的高效 Chord 支持(问题 #533)

    这意味着 Memcached 加入了 Redis 的能力,以进行非轮询和弦。

    由丹·麦吉贡献。

  • 为 Rabbit 结果后端 (amqp) 添加 Chord 支持

    Rabbit 结果后端现在可以使用回退和弦解决方案。

  • 发送 :sig:`QUIT`celeryd 现在将导致它冷终止。

    也就是说,它不会完成当前正在处理的任务。

    由亚历克克劳斯提供。

  • Cassandra 后端的新“详细”模式。

    允许为 Cassandra 后端提供“详细”模式。 基本上这个想法是使用 Cassandra 宽列保留所有状态。 然后将新状态作为新列附加到行中,最后一个状态是最后一列。

    请参阅 :setting:`CASSANDRA_DETAILED_MODE` 设置。

    由史蒂夫·莫林提供。

  • Crontab 解析器现在在使用步骤(例如 1-59/2)解析范围时匹配 Vixie Cron 行为。

    由丹尼尔·赫珀提供。

  • celerybeat 现在可以像 celeryd 一样在命令行上进行配置。

    必须在参数列表的末尾添加附加配置,后跟 --,例如:

    $ celerybeat -l info -- celerybeat.max_loop_interval=10.0
  • 现在限制回溯中的帧数,以便 celeryd 不会因超出最大递归限制的异常而崩溃(问题 #615)。

    限制设置为当前递归限制除以 8(默认为 125)。

    要获取或设置当前递归限制,请使用 sys.getrecursionlimit()sys.setrecursionlimit()

  • 更多信息现在保存在可腌制的回溯中。

    已添加此项,以便 Sentry 可以显示更多详细信息。

    由肖恩·奥康纳提供。

  • CentOS init-script 已经更新,应该更灵活。

    由安德鲁·麦克法格提供。

  • MongoDB 结果后端现在支持 [X36X]。

    安德鲁·麦克法格供稿

  • task.retry() 现在重新引发保持原始堆栈跟踪的原始异常。

  • 守护进程的 –uid 参数现在使用 initgroups() 将组设置为用户所属的所有组。

    由 Łukasz Oleś 提供。

  • celeryctl:新增 shell 命令。

    shell 将具有 current_app (celery) 和所有任务自动添加到本地。

  • celeryctl:新增 migrate 命令。

    migrate 命令将所有任务从一个代理移动到另一个代理。 请注意,这是实验性的,您应该在继续之前备份数据。

    示例

    $ celeryctl migrate redis://localhost amqp://localhost
    $ celeryctl migrate amqp://localhost//v1 amqp://localhost//v2
    $ python manage.py celeryctl migrate django:// redis://
  • 路由器现在可以覆盖用于创建丢失队列的 exchangerouting_key(问题 #577)。

    默认情况下,这将始终使用队列的名称,但您现在可以使用路由器返回交换和 routing_key 键来设置它们。

    这在使用在运行时决定目的地的路由类时很有用。

    由 Akira Matsuzaki 提供。

  • Redis 结果后端:添加对 max_connections 参数的支持。

    现在可以在 Redis 连接池中配置用于结果的最大并发连接数。

    默认最大连接数设置可以使用 :setting:`CELERY_REDIS_MAX_CONNECTIONS` 设置进行配置,也可以通过 RedisBackend(max_connections=int) 单独更改。

    由史蒂夫·莫林提供。

  • Redis 结果后端:添加无需轮询即可等待结果的功能。

    由史蒂夫·莫林提供。

  • MongoDB 结果后端:现在支持保存和恢复 taskset

    由 Julien Poissonnier 提供。

  • 文档中有一个新的 Security 指南。

  • 初始化脚本已更新,并修复了许多错误。

    克里斯·斯特里特供稿。

  • 用户(波浪号)现在在命令行参数中展开。

  • 现在可以在 /etc/default/celeryd 中配置 CELERYCTL 环境变量。

    celeryctl虽然不是操作所必需的,但用于celeryd status命令,并且必须配置到celeryctl的路径才能工作。

    守护程序手册包含示例。

    由裘德·纳格尼提供。

  • MongoDB 结果后端现在可以使用副本集。

    由伊万·梅茨拉尔提供。

  • gevent:现在支持自动缩放(问题 #599)。

    由马克·拉文提供。

  • 多处理:现在总是启用中介线程,即使速率限制被禁用,因为池信号量已知会阻塞主线程,导致广播命令和关闭取决于正在释放的信号量。


修复

  • 使用新异常对象重新引发的异常现在保留原始堆栈跟踪。

  • Windows:修复了 no handlers found for multiprocessing 警告。

  • Windows:现在可以使用 celeryd 程序。

    以前,Windows 用户必须使用 python -m celery.bin.celeryd 启动 celeryd

  • Redis 结果后端:现在使用 SETEX 命令设置结果键,并自动过期。

  • celeryd:修复了使用Control-c终止时shutdown挂起的问题。

  • celeryd:通道错误时不再崩溃。

    修复由 Roger Hu 提供。

  • 修复了由于使用 greenlet.getcurrent 而导致的 eventlet 池中的内存泄漏。

    修复由 Ignas Mikalajūnas 贡献。

  • Cassandra 后端:不再使用自 :pypi:`pycassa` 1.4 起已弃用的 pycassa.connect()

    修复由 Jeff Terrace 贡献。

  • 修复了发送错误电子邮件时可能发生的 unicode 解码错误。

    修复由 Seong Wun Mun 贡献。

  • celery.bin 程序现在总是按照 PEP-366 的建议定义 __package__

  • send_task 现在与 :setting:`CELERY_ALWAYS_EAGER` 结合使用时会发出警告(问题 #581)。

    由 Mher Movsisyan 提供。

  • apply_async 现在在启用 :setting:`CELERY_ALWAYS_EAGER` 时将原始关键字参数转发到 apply

  • celeryev 现在尝试在与代理的连接丢失时重新建立连接(问题 #574)。

  • celeryev:修复了如果任务没有关联的工作人员信息时发生的崩溃。

    修复由马特威廉姆森贡献。

  • 当前日期和时间现在一致地取自当前加载程序 now 方法。

  • 现在,当给出无法导入的以 .py 结尾的配置模块时,会显示有用的错误消息。

  • celeryctl:apply 命令的 --expires--eta 参数现在可以是 ISO-8601 格式的字符串。

  • celeryctl 现在在没有收到回复时以退出状态 EX_UNAVAILABLE (69) 退出。