【celery】User Guide[用户指南]--Application

本文档描述了当前稳定版本的celery(4.1)

Application

1     Main Name
2     Configuration
3     Laziness
4     Breaking the chain
5     Abstract Tasks

必须在使用前实例化celery库,这个实例称为application(简称app)。

该应用程序是线程安全的,因此具有不同配置、组件的多个Celery applications,而且任务可以在同一个进程空间中共存。

现在让我们创建一个:

>>> from celery import Celery
>>> app = Celery()
>>> app
<Celery __main__:0x100469fd0>

最后一行显示application的文本表示,包括Celery类的名称,当前主模块的名称(__main__),以及对象的内存地址(0x100469fd0)。

Main Name

 

其中只有一个是重要的,并且这是主要的模块名称,我们来看看为什么。

当你在celery中发送任务信息时,该消息不包含任何源代码,但只有您要执行的任务的名称,这与主机名在internet上的工作方式类似: \

每个worker都维护一个任务名称到其实际函数的映射,称为任务注册表。

当您定义一个任务时,该任务也将被添加到本地注册中心:

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

>>> add
<@task: __main__.add>

>>> add.name
__main__.add

>>> app.tasks['__main__.add']
<@task: __main__.add>

 在这里,你又看到了__main__。当celery无法检测出该函数属于哪个模块时,它使用主模块名称来生成任务名称的开头。

这个问题仅仅出现在下面的例子中:

  1. 如果任务定义的模块是作为一个程序运行的。
  2. 如果应用程序是在Python shell中创建的(REPL)。

例如,在这里,任务模块也用于启动一个具有app.worker_main()的worker:

tasks.py:

from celery import Celery
app = Celery()

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

if __name__ == '__main__':
    app.worker_main()

当这个模块执行时,任务将以“__main__”命名,但是当模块被另一个进程导入时,\

假设调用一个任务,任务将以“tasks”(模块的真实名称)开始命名

>>> from tasks import add
>>> add.name
tasks.add

您可以为主模块指定另一个名称:

>>> app = Celery('tasks')
>>> app.main
'tasks'

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

>>> add.name
tasks.add

另请参阅

Names

configuration

你可以设置几个选项来改变Celery的工作方式,这些选项可以直接在app实例上设置,\

或者您可以使用专用的配置模块。

该配置可作为app.conf提供:

>>> app.conf.timezone
'Europe/London'

您还可以直接设置配置值:

>>> app.conf.enable_utc = True

或使用更新方法一次更新多个键:

>>> app.conf.update(
...     enable_utc=True,
...     timezone='Europe/London',
...)

该配置对象由多个被协商的字典组成:

  1. 在运行时所做的更改。
  2. 配置模块(如果有)
  3. 默认配置(celery.app.defaults).

您甚至可以使用app.add_defaults()方法添加新的默认设置。

另请参阅:

转到Configuration reference,以获得所有可用设置的完整列表,以及它们的默认值。

config_from_object

app.config_from_object()方法从配置对象加载配置。

这可以是一个配置模块,或者任何具有配置属性的对象。

注意,当调用config_from_object()时,先前设置的任何配置都将被重置。如果您想要设置额外的配置,您应该这样做。

示例1:使用模块的名称。

config_from_object()方法可以使用Python模块的完全限定名,甚至是Python属性的名称,例如:

from celery import Celery

app = Celery()
app.config_from_object('celeryconfig')

celeryconfig模块可能是这样的:

celeryconfig.py:

enable_utc = True
timezone = 'Europe/London'

只要导入celeryconfig,应用程序就能使用它。

示例2:通过一个实际的模块对象

您还可以传递已经导入的模块对象,但这并不总是推荐的。

Tip:

 

posted @ 2018-02-06 16:02  丰study  阅读(130)  评论(0)    收藏  举报