Application(应用)
Celery 库在使用之前必须初始化,一个celery实例被称为一个应用(或者缩写 app)。
Celery 应用是线程安全的,所以多个不同配置、不同组件、不同任务的 应用可以在一个进程空间里共存。
下面创建一个 celery 应用:
1 | from celery import Celery |
最后一行显示的是 celery 应用的文本表示: 包含应用类的名称(Celery),当前主模块的名称(main),以及应用对象的内存地址(0x100469fd0)。
Main Name
上述文本表示中只有一部分是重要的,那就是主模块名称。下面分析下它为何重要。
当你发送一个消息给 Celery,消息中不会包含任何源码,而只有你想要执行的任务的名称。这就好像因特网上的域名映射原理一般:每个执行单元维护着一个任务名称到实际任务函数的映射,这个映射被称为任务注册表。
1 | @app.task |
现在,你又看到显示 main 模块名称;当Celery不能探查到这个任务函数属于哪个模块时,它将使用主模块名称来产生任务名称的前缀。
这在有些情况下会产生问题:
- 定义任务的主模块作为一个程序运行。
- 应用在python交互终端创建。
例如下面程序,定义任务的模块还调用 app.worker_main()
来启动一个工作单元:
task.py
1 | from celery import Celery |
当这个模块运行,任务将以前缀__main__
命名,但是当该模块被其他进程引入来运行一个任务,这个任务的名称将以前缀 tasks 命名(即这个模块的真实名称)。
1 | from tasks import add |
你可以给主模块声明另外一个名称
1 | 'tasks') app = Celery( |
具体可以查看名称这节