Celery 2.1 的更改历史记录 — Python 文档

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

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)

    告诉工作人员停止从队列中消费(按队列名称)。

    命令还添加到 celeryctlinspect

    使用 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')
  • 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 管理监视器,您需要执行以下操作:

    1. 创建新的数据库表:

      $ python manage.py syncdb
    2. 启动 :pypi:`django-celery` 快照相机:

      $ python manage.py celerycam
    3. 打开 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() 以便它应该与 py2exePyInstallercx_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` 结果。

  • 重构了负责清理结果的周期性任务。

    • 后端清理任务现在仅在以下情况下添加到计划中

      :setting:`CELERY_TASK_RESULT_EXPIRES` 已设置。

    • 如果调度已经包含一个名为“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 脚本


文档

  • 添加了用户指南部分:监控

  • 添加了用户指南部分:周期性任务

    从 入门/定期任务 移动并更新。

  • 教程/外部移动到新部分:“社区”。

  • 参考文献已添加到文档中的所有部分。

    这使得文档之间的链接更容易。