跳转到主要内容

pyramid与Celery的集成

项目描述

入门指南

https://travis-ci.org/sontek/pyramid_celery.png?branch=master https://coveralls.io/repos/sontek/pyramid_celery/badge.png?branch=master https://img.shields.io/pypi/v/pyramid_celery.svg

通过在您的.ini中设置包含,或通过调用 config.include('pyramid_celery') 来包含pyramid_celery。

pyramid.includes = pyramid_celery

然后,您只需告诉 pyramid_celery 您的 [celery] 部分所在的ini文件。

config.configure_celery('development.ini')

然后您就可以自由使用celery了,例如基于类的

from pyramid_celery import celery_app as app

class AddTask(app.Task):
    def run(self, x, y):
        print x+y

或基于装饰器的

from pyramid_celery import celery_app as app

@app.task
def add(x, y):
    print x+y

要获取pyramid设置,您可以在 app.conf['PYRAMID_REGISTRY'] 中访问它们。

配置

默认情况下,pyramid_celery 假设您想要通过ini设置配置celery。您可以通过调用 config.configure_celery(‘development.ini’) 来执行此操作,但如果您已经在应用程序的 main 中,并希望使用用于配置应用程序的ini,您可以执行以下操作

config.configure_celery(global_config['__file__'])

如果您想使用标准的 celeryconfig python文件,您可以将 use_celeryconfig = True 设置如下

[celery]
use_celeryconfig = True

有关celeryconfig.py的更多信息,请在此处查找

http://celery.readthedocs.io/zh/latest/userguide/configuration.html

一个示例 INI 配置如下所示

[celery]
broker_url = redis://localhost:1337/0
imports = app1.tasks
          app2.tasks

[celery:broker_transport_options]
visibility_timeout = 18000
max_retries = 5

[celerybeat:task1]
task = app1.tasks.Task1
type = crontab
schedule = {"minute": 0}

您会注意到配置选项如果是字典或具有多个值,将分入各自的节。

计划/周期性任务

要使用 celerybeat(周期性任务),您需要为每个任务声明一个 celerybeat 配置节。选项包括

  • task - 需要执行的 Python 任务。

  • type - 您配置使用的调度类型,选项为 crontabtimedeltainteger

  • schedule - 您配置类型的实际计划。

  • args - 额外的位置参数。

  • kwargs - 额外的关键字参数。

此示例的配置如下

[celerybeat:task1]
task = app1.tasks.Task1
type = crontab
schedule = {"minute": 0}

[celerybeat:task2]
task = app1.tasks.Task2
type = timedelta
schedule = {"seconds": 30}
args = [16, 16]

[celerybeat:task3]
task = app2.tasks.Task1
type = crontab
schedule = {"hour": 0, "minute": 0}
kwargs = {"boom": "shaka"}

[celerybeat:task4]
task = myapp.tasks.Task4
type = integer
schedule = 30

一个需要注意的问题是,计划任务中的日期/时间默认为 UTC。如果您想为本地时区计划确切的日期/时间,则需要设置 timezone。有关该文档的说明,请参考此处

http://celery.readthedocs.org/zh/latest/userguide/periodic-tasks.html#time-zones

如果您需要查找可用的时区,可以执行以下操作

from pprint import pprint
from pytz import all_timezones
pprint(all_timezones)

工作进程执行

celerybeat 工作进程将读取您的配置,并将任务调度到队列中,在指定的时间执行。这意味着如果您使用 celerybeat,您将运行 2 个工作进程

$ celery -A pyramid_celery.celery_app worker --ini development.ini
$ celery -A pyramid_celery.celery_app beat --ini development.ini

第一个命令是标准的工人命令,它将从队列中读取消息并运行任务。第二个命令将读取 celerybeat 配置,并定期在队列上调度任务。

路由

如果您想将任务路由到特定的队列,您可以通过在 celeryroute 节中声明它们的 queue 和/或 routing_key 来为每个任务定义一个路由。

此示例的配置如下

[celeryroute:otherapp.tasks.Task3]
queue = slow_tasks
routing_key = turtle

[celeryroute:myapp.tasks.Task1]
queue = fast_tasks

运行工作进程

要运行工作进程,我们只需使用标准的 celery 命令并添加一个额外的参数

celery worker -A pyramid_celery.celery_app --ini development.ini

如果您在 .ini 中定义了变量,例如 %(database_username)s,您可以使用 –ini-var 参数,这是一个键值对的逗号分隔列表

celery worker -A pyramid_celery.celery_app --ini development.ini --ini-var=database_username=sontek,database_password=OhYeah!

ini-var 中的值不能有空格,这将破坏 celery 的解析器。

它使用 csv 而不是多次使用 –ini-var 的原因是 celery 自身的一个错误。当它们修复错误时,我们将重新工作 API。问题跟踪在此

https://github.com/celery/celery/pull/2435

如果您使用 celerybeat 调度程序,则需要使用 –beat 标志同时运行 beat 和工作进程。

celery worker --beat -A pyramid_celery.celery_app --ini development.ini

或者您可以单独启动它,如下所示

celery beat -A pyramid_celery.celery_app --ini development.ini

日志记录

如果您使用 .ini 配置(即不使用 celeryconfig.py),则日志配置将加载到 .ini 中,而不会使用默认的 celery 日志记录器。

您很可能想在 ini 中也添加一个 celery 的日志记录节

[logger_celery]
level = INFO
handlers =
qualname = celery

然后更新您的 [loggers] 节以包括它。

如果您想使用默认的 celery 日志记录器,则可以在 .ini 的 [celery] 节中设置 CELERYD_HIJACK_ROOT_LOGGER=True

Celery 工作进程不会在任务内部传播异常,但默认情况下会静默吞没它们。这与异步任务结果的读取行为有关。为了查看任务是否失败,您可能需要配置 celery.worker.job 日志记录器以传播异常

# Make sure Celery worker doesn't silently swallow exceptions
# See http://stackoverflow.com/a/20719461/315168
# https://github.com/celery/celery/issues/2437
[logger_celery_worker_job]
level = ERROR
handlers =
qualname = celery.worker.job
propagate = 1

如果您想使用默认的 celery 日志记录器,则可以在 .ini 的 [celery] 节中设置 CELERYD_HIJACK_ROOT_LOGGER=True

演示

要查看所有操作,请查看 examples/long_running_with_tm,运行 redis-server,然后执行

$ python setup.py develop
$ populate_long_running_with_tm development.ini
$ pserve ./development.ini
$ celery worker -A pyramid_celery.celery_app --ini development.ini

4.0.0

  • 放弃对 celery 3.0 的支持

  • 放弃对 Pyramid 2.7 的支持

  • 如果 ini 配置错误,则报错

  • 添加对 pyramid v2 的支持

  • 添加对 celery v5 的支持

  • 放弃对旧 CELERY 配置选项的支持,只使用小写版本。

  • 在 celerybeat 中添加了对 options 的支持。

  • 添加了对 broker_transport_options 的支持。

3.0.0

  • 支持 celery 4.0。

  • 正确处理 CELERY_ALWAYS_EAGER。

  • 处理 ADMINS 中的元组。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

pyramid_celery-4.0.0.tar.gz (9.3 kB 查看哈希值)

上传时间

构建分发

pyramid_celery-4.0.0-py3-none-any.whl (8.0 kB 查看哈希值)

上传时间 Python 3

支持者: