【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无法检测出该函数属于哪个模块时,它使用主模块名称来生成任务名称的开头。
这个问题仅仅出现在下面的例子中:
- 如果任务定义的模块是作为一个程序运行的。
- 如果应用程序是在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
另请参阅
configuration
你可以设置几个选项来改变Celery的工作方式,这些选项可以直接在app实例上设置,\
或者您可以使用专用的配置模块。
该配置可作为app.conf提供:
>>> app.conf.timezone 'Europe/London'
您还可以直接设置配置值:
>>> app.conf.enable_utc = True
或使用更新方法一次更新多个键:
>>> app.conf.update( ... enable_utc=True, ... timezone='Europe/London', ...)
该配置对象由多个被协商的字典组成:
- 在运行时所做的更改。
- 配置模块(如果有)
- 默认配置(
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:

浙公网安备 33010602011771号