Celery 2.1 的更改历史记录 — Python 文档
Celery 2.1 的更改历史记录
2.1.4
- 发布日期
- 2010-12-03 12:00 下午 中科院
- 发布者
- 问庄严
修复
- apply_async 的执行选项现在优先于活动路由器返回的选项。 这是最近引入的回归(问题 #244)。
- 诅咒监视器:长参数现在被截断,因此诅咒不会因越界错误而崩溃(问题#235)。
- multi:处理控制命令时发生的通道错误不再使 worker 崩溃,而是记录严重性错误。
- SQLAlchemy 数据库后端:修复了客户端写入挂起状态时发生的竞争条件。 就像 Django 数据库后端一样,它不再保存挂起状态(问题 #261 + 问题 #262)。
- 错误电子邮件正文现在使用 repr(exception) 而不是 str(exception),因为后者可能导致 Unicode 解码错误(问题 #245)。
- 现在可以使用 :setting:`EMAIL_TIMEOUT` 设置来配置错误电子邮件超时值。
- celeryev:现在可以在 Windows 上运行(但是如果没有curses,curses 监视器将无法工作)。
- 单元测试输出不再发出非标准字符。
- worker:如果连接被重置,广播消费者现在关闭。
- worker:现在可以正确处理在尝试确认消息时发生的错误。
- *; TaskRequest.on_failure 现在使用当前文件系统对回溯进行编码
- 编码(问题 #286)。
- EagerResult 现在可以被腌制(问题 #288)。
2.1.3
- 发布日期
- 2010-11-09 05:00 下午 中科院
- 发布者
- 问庄严
修复了 timer2 中可能导致 djcelerymon/celeryev -c 挂起的死锁。
EventReceiver:现在发送心跳请求来寻找工作人员。
这意味着 celeryev 和朋友在启动时立即找到工人。
celeryev
诅咒监视器:将screen_delay 设置为10ms,使屏幕刷新更频繁。修复了在旧 Python 版本上酸洗
AsyncResult
时的酸洗错误。worker:即使没有活动的预取限制,预取计数也会被 ETA 任务递减。
2.1.2
- 发布数据
- 待定
修复
- worker:现在为重试任务发送 :event:`task-reried` 事件。
- worker:现在忽略
@WorkerLostError
和超时错误的结果。 celerybeat
:修复了使用记录设置信号时celerybeat
记录中的UnboundLocalError
。- 工人:所有日志消息现在都包含 exc_info。
2.1.1
- 发布日期
- 2010-10-14 02:00 下午 中科院
- 发布者
- 问庄严
修复
现在再次在 Windows 上工作。
删除了对
pwd
/grp
模块的依赖。快照:修复了导致事件丢失的竞争条件。
worker:拒绝带有无法转换为时间戳的 ETA 的任务。
见问题#209
concurrency.processes.pool:为每个任务释放信号量两次(在 ACK 和结果就绪时)。
这已得到修复,现在每个任务只发布一次。
文档/配置:修正错字 CELERYD_TASK_SOFT_TIME_LIMIT -> :setting:`CELERYD_TASK_SOFT_TIME_LIMIT`。
见问题 #214
控制命令 dump_scheduled:正在使用旧的 .info 属性
- multi:修复了 迭代期间设置更改的大小 错误
发生在重启命令中。
工人:无意中尝试使用其他命令行参数。
这将导致如下错误:
为关键字参数“并发” 获得了多个值。
额外的命令行参数现在被忽略,并且不会产生这个错误。 但是 - 我们保留将来使用位置参数的权利,所以请不要依赖这种行为。
celerybeat
:现在再次尊重路由器和任务执行选项。celerybeat
:现在重用发布者而不是连接。缓存结果后端:使用
float
作为 cache.set 的 expires 参数已被 Memcached 库弃用,因此我们现在自动转换为int
。单元测试:不再在测试输出中发出日志和警告。
新闻
现在取决于胡萝卜版本 0.10.7。
添加了 :setting:`CELERY_REDIRECT_STDOUTS` 和 :setting:`CELERYD_REDIRECT_STDOUTS_LEVEL` 设置。
:setting:`CELERY_REDIRECT_STDOUTS` 被worker 使用和beat。 如果启用,所有输出到 stdout 和 stderr 将被重定向到当前记录器。
:setting:`CELERY_REDIRECT_STDOUTS_LEVEL` 决定使用的日志级别,默认为
WARNING
。添加了 :setting:`CELERYBEAT_SCHEDULER` 设置。
此设置用于定义 celerybeat 的 -S 选项的默认值。
示例:
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
添加Task.expires:用于设置任务的默认到期时间。
新的远程控制命令:add_consumer 和 cancel_consumer。
- add_consumer(queue, exchange, exchange_type, routing_key,
\*\*options) 告诉工作人员从指定的声明中声明和消费。
- cancel_consumer(queue_name)
告诉工作人员停止从队列中消费(按队列名称)。
命令还添加到 celeryctl 和
inspect
。使用
celeryctl
从队列“queue”开始消费的示例,作为交换“exchange”,使用绑定键“key”,类型为“direct”:$ celeryctl inspect add_consumer queue exchange direct key $ celeryctl inspect cancel_consumer queue
有关 celeryctl 程序的更多信息,请参阅 管理命令行实用程序(检查/控制)。
另一个使用
inspect
的例子:>>> from celery.task.control import inspect >>> inspect.add_consumer(queue='queue', exchange='exchange', ... exchange_type='direct', ... routing_key='key', ... durable=False, ... auto_delete=True) >>> inspect.cancel_consumer('queue')
- add_consumer(queue, exchange, exchange_type, routing_key,
celerybeat
:如果无法发送消息,现在记录回溯。celerybeat
:现在启用 30 秒的默认套接字超时。README
/介绍/主页:添加了Flask-Celery的链接。
2.1.0
- 发布日期
- 2010-10-08 12:00 下午 中科院
- 发布者
- 问庄严
重要说明
Celery 现在遵循 semver 定义的版本语义。
这意味着我们不再允许使用奇数/偶数版本语义根据我们之前的版本方案,这个稳定版本应该是 2.2 版。
现在取决于 Carrot 0.10.7。
不再依赖SQLAlchemy,如果使用数据库结果后端需要单独安装。
:pypi:`django-celery` 现在带有 Django 管理界面的监视器。 如果您不是 Django 用户,也可以使用它。 (更新:Django-Admin 监控器已被 Flower 取代,请参阅监控指南)。
如果升级后出现错误提示:AttributeError: 'module' object has no attribute 'system',
那么这是因为 celery.platform 模块已重命名为 celery.platforms 以免与内置的
platform
模块发生冲突。您必须从以前的 Celery 安装中删除旧的
platform.py
(可能还有platform.pyc
)文件。为此,请使用 python 查找此模块的位置:
$ python >>> import celery.platform >>> celery.platform <module 'celery.platform' from '/opt/devel/celery/celery/platform.pyc'>
这里编译的模块在
/opt/devel/celery/celery/
中,要删除有问题的文件,请执行以下操作:$ rm -f /opt/devel/celery/celery/platform.py*
新闻
添加了对 AMQP 结果过期的支持(需要 RabbitMQ 2.1.0)
新的配置选项 :setting:`CELERY_AMQP_TASK_RESULT_EXPIRES` 以秒为单位设置到期时间(可以是 int 或 float):
CELERY_AMQP_TASK_RESULT_EXPIRES = 30 * 60 # 30 minutes. CELERY_AMQP_TASK_RESULT_EXPIRES = 0.80 # 800 ms.
celeryev
:事件快照如果启用,工作人员会发送有关工作人员正在做什么的消息。 这些消息称为“事件”。 实时监控器使用这些事件来显示集群正在做什么,但它们对于长时间监控并不是很有用。 快照让您可以定期拍摄集群状态的“图片”。 然后可以将其存储在数据库中以生成统计数据,甚至可以在更长的时间段内进行监控。
:pypi:`django-celery` 现在带有用于 Django 管理界面的 Celery 监视器。 要使用它,您需要运行 :pypi:`django-celery` 快照相机,它以可配置的时间间隔将快照存储到数据库中。
要使用 Django 管理监视器,您需要执行以下操作:
创建新的数据库表:
$ python manage.py syncdb
启动 :pypi:`django-celery` 快照相机:
$ python manage.py celerycam
打开 django admin 来监控你的集群。
管理界面显示任务、工作节点,甚至允许您执行一些操作,例如撤销和限速任务,以及关闭工作节点。
还有一个用于
events
的 Debian init.d 脚本,请参阅 Daemonization 了解更多信息。celeryev
的新命令行参数:celery events --camera
:要使用的快照相机类。celery events --logfile
:日志文件celery events --loglevel
:日志级别celery events --maxrate
:快门速度限制。celery events --freq
:快门频率
--camera
参数是用于拍摄快照的类的名称。 它必须支持celery.events.snapshot.Polaroid
定义的接口。快门频率控制相机线程唤醒的频率,而速率限制控制它实际拍摄快照的频率。 速率限制可以是整数(快照/秒),也可以是与任务速率限制字符串(“200/m”、“10/s”)具有相同语法的速率限制字符串、“1/h”、 等)。
对于 Django 相机案例,此速率限制可用于控制快照写入数据库的频率,以及用于控制线程唤醒以检查是否有新内容的频率。
默认情况下,速率限制是关闭的,这意味着它将每
--frequency
秒拍摄一次快照。broadcast()
:添加回调参数,可用于在回复到达时立即处理。celeryctl
:用于管理和检查工作节点、应用任务和检查任务结果的新命令行实用程序。也可以看看
用户指南 中的 管理命令行实用程序(检查/控制) 部分。
一些例子:
$ celeryctl apply tasks.add -a '[2, 2]' --countdown=10 $ celeryctl inspect active $ celeryctl inspect registered_tasks $ celeryctl inspect scheduled $ celeryctl inspect --help $ celeryctl apply --help
添加了为任务设置到期日期和时间的功能。
示例:
>>> # Task expires after one minute from now. >>> task.apply_async(args, kwargs, expires=60) >>> # Also supports datetime >>> task.apply_async(args, kwargs, ... expires=datetime.now() + timedelta(days=1)
当工作人员收到已过期的任务时,它将被标记为已撤销 (
@TaskRevokedError
)。更改了日志记录的配置方式。
我们现在配置根记录器,而不是仅配置我们的自定义记录器。 此外,我们不再劫持多处理记录器,而是为不同的应用程序使用自定义记录器名称:
应用
记录器名称
celeryd
"celery"
celerybeat
"celery.beat"
celeryev
"celery.ev"
这意味着 loglevel 和 logfile 参数将影响所有注册的记录器(甚至来自第三方库的记录器)。 除非您如下所示手动配置记录器,否则。
用户可以通过订阅 :signal:`~celery.signals.setup_logging` 信号来选择配置日志记录:
from logging.config import fileConfig from celery import signals @signals.setup_logging.connect def setup_logging(**kwargs): fileConfig('logging.conf')
如果此信号没有接收器,日志子系统将使用
--loglevel
/--logfile
参数进行配置,这将用于 所有定义的记录器 。请记住,worker 还将 stdout 和 stderr 重定向到 Celery 记录器,如果手动配置日志记录,您还需要手动重定向标准输出:
from logging.config import fileConfig from celery import log def setup_logging(**kwargs): import logging fileConfig('logging.conf') stdouts = logging.getLogger('mystdoutslogger') log.redirect_stdouts_to_logger(stdouts, loglevel=logging.WARNING)
worker 添加了命令行选项
--include
:要导入的(任务)模块的逗号分隔列表。
示例:
$ celeryd -I app1.tasks,app2.tasks
worker:如果以 root 用户身份运行(euid 为 0),现在会发出警告。
celery.messaging.establish_connection()
:能够覆盖使用关键字参数“defaults”使用的默认值。工人:现在使用 multiprocessing.freeze_support() 以便它应该与 py2exe、PyInstaller、cx_Freeze 等一起使用。
worker:现在包含 :state:`STARTED` state: PID 和启动任务的 worker 的主机名的更多元数据。
见问题 #181
子任务:将 subtask() 的附加关键字参数合并到任务关键字参数中。
例如:
>>> s = subtask((1, 2), {'foo': 'bar'}, baz=1) >>> s.args (1, 2) >>> s.kwargs {'foo': 'bar', 'baz': 1}
见问题#182。
worker:如果已经有一个使用相同名称的工作节点在同一虚拟主机上运行,现在会发出警告。
AMQP 结果后端:如果连接断开,现在会重试发送结果。
- AMQP 结果后端:result.get():如果状态不是,则等待下一个状态
在
READY_STATES
。
TaskSetResult 现在支持订阅。
>>> res = TaskSet(tasks).apply_async() >>> res[0].get()
添加了 Task.send_error_emails + Task.error_whitelist,因此这些可以按任务配置,而不仅仅是通过全局设置。
添加了 Task.store_errors_even_if_ignored,因此它可以根据任务进行更改,而不仅仅是通过全局设置。
Crontab 调度器不再每秒唤醒一次,而是实现 remaining_estimate (Optimization)。
- worker: Store :state:`FAILURE` 结果如果
@WorkerLostError
异常发生(工作进程消失)。
worker: 如果发生 *TimeLimitExceeded 异常之一,则存储 :state:`FAILURE` 结果。
重构了负责清理结果的周期性任务。
- 后端清理任务现在仅在以下情况下添加到计划中
如果调度已经包含一个名为“celery.backend_cleanup”的周期性任务,它不会改变它,所以后端清理任务的行为可以很容易地改变。
该任务现在每天凌晨 4:00 运行,而不是自第一次运行以来的每一天(使用 Crontab 计划而不是 run_every)
- 重命名 celery.task.builtins.DeleteExpiredTaskMetaTask
->
celery.task.builtins.backend_cleanup
任务本身已从“celery.delete_expired_task_meta”重命名为“celery.backend_cleanup”
见问题#134。
为 SQLAlchemy/Memcached/Redis/Tokyo Tyrant 后端实现了 AsyncResult.forget(忘记并删除任务结果)。
见问题#184。
TaskSetResult.join
:添加了“propagate=True”参数。当设置为
False
时,子任务中发生的异常将不会重新引发。添加 Task.update_state(task_id, state, meta) 作为 task.backend.store_result(task_id, meta, state) 的快捷方式。
后端接口是“私有的”并且术语已经过时,因此最好将其移至
Task
以便可以使用。timer2:在
stop()
中设置 self.running=False,这样它就不会在后续调用 stop() 时再次尝试加入。Windows 上现在默认禁用日志颜色。
celery.platform 重命名为
celery.platforms
,因此它不会与内置的platform
模块发生冲突。现在可以捕获并记录 Mediator+Pool 回调中发生的异常,而不是关闭工作线程。
Redis 结果后端:现在支持使用 Redis EXPIRE 命令的结果过期。
单元测试:不要让线程在拆卸时运行。
worker:日志中显示的任务结果现在被截断为 46 个字符。
- Task.__name__ 现在是 self.__class__.__name__ 的别名。
通过这种方式,任务内省更像是常规函数。
Task.retry:如果 kwargs 参数为空,现在会引发
TypeError
。见问题#164。
timedelta_seconds
:如果在 Python 2.7 上运行,请使用timedelta.total_seconds
TokenBucket
:通用令牌桶算法celery.events.state
:现在可以暂停和恢复集群状态的记录,包括对缓冲的支持。- State.freeze(buffer=True)
暂停记录流。
如果 buffer 为真,则冻结时接收到的事件将被缓冲,并可能在稍后重播。
- State.thaw(replay=True)
恢复流的记录。
如果 replay 为真,则将应用记录的缓冲区。
- State.freeze_while(fun)
使用要应用的函数,冻结之前的流,并在函数返回后重放缓冲区。
EventReceiver.capture
现在支持超时关键字参数。worker:如果 :setting:`CELERY_RATE_LIMITS` 启用,则中介线程现在被禁用,并且任务直接发送到池中,无需经过就绪队列(优化)。
修复
池:由 TimeoutHandler 超时的进程必须由 Supervisor 加入,因此不要将其从内部进程列表中删除。
见问题#192。
TaskPublisher.delay_task 现在支持交换参数,因此在使用同一发布者批量发送任务时可以覆盖交换
见问题#187。
如果启用了 :setting:`CELERY_IGNORE_RESULT`,则工作人员不再将任务标记为已撤销。
见问题#207。
AMQP 结果后端:修复了 result.get() 如果 :setting:`CELERY_TRACK_STARTED` 启用的错误。
result.get() 会在收到 :state:`STARTED` 状态后停止消费。
修复了从任务队列读取时由池主管创建的新进程卡住的错误。
修复声明远程控制命令回复队列时的计时问题
此问题可能会导致回复丢失,但现已修复。
向后兼容 LoggerAdapter 实现:现在适用于 Python 2.4。
还增加了对几种新方法的支持:fatal、makeRecord、_log、log、isEnabledFor、 ]addHandler, removeHandler。
实验性的
multi:添加了守护进程支持。
multi 现在可用于启动、停止和重启工作节点:
$ celeryd-multi start jerry elaine george kramer
这还会创建 PID 文件和日志文件 (
celeryd@jerry.pid
, ...,celeryd@jerry.log
. 要为这些文件指定位置,请使用 %n 格式的 –pidfile 和 –logfile 参数:$ celeryd-multi start jerry elaine george kramer \ --logfile=/var/log/celeryd@%n.log \ --pidfile=/var/run/celeryd@%n.pid
停止:
$ celeryd-multi stop jerry elaine george kramer
重新启动。 随着旧节点的关闭,节点将一一重启:
$ celeryd-multi restart jerry elaine george kramer
杀死节点(警告:将丢弃当前正在执行的任务):
$ celeryd-multi kill jerry elaine george kramer
请参阅 celeryd-multi 帮助 获取帮助。
multi: start 命令重命名为 show。
celeryd-multi start 现在将实际启动和分离工作节点。 要生成命令,您必须使用 celeryd-multi show。
工人:添加了 –pidfile 参数。
Worker 将在启动时写入其 pid。 如果此文件存在并且包含的 pid 仍然存在,则不会启动工作程序。
使用 celeryd-multi 添加通用 init.d 脚本
文档
添加了用户指南部分:监控
添加了用户指南部分:周期性任务
从 入门/定期任务 移动并更新。
教程/外部移动到新部分:“社区”。
参考文献已添加到文档中的所有部分。
这使得文档之间的链接更容易。