Celery 2.5 的新特性 — Python 文档
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_task
、celery.execute.apply
和celery.execute.apply_async
已被删除(最初)计划在 2.3 中删除。 - 内置的
ping
任务已被移除(原定于 2.3 中移除)。 请改用 ping 广播命令。 - 不再可能从
celery.task.base
导入subtask
和TaskSet
,请改为从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 版中默认启用。
使用加密签名的新安全序列化程序
添加了一个新的序列化程序,用于对消息签名进行签名和验证。
新序列化程序的名称是 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)
),这将不起作用。 为此,必须使用 apply
:update_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://
路由器现在可以覆盖用于创建丢失队列的
exchange
和routing_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) 退出。