celery_02 application使用
基本定义:
application即程序中app的缩写;
application是线程安全和独立的,因此不同配置的应用、任务等可以在同一个进程中共存。
demo:
>>> from celery import Celery >>> app = Celery() >>> app <Celery __main__:0x100469fd0>
该线程是主线程,内存地址为:0x100469fd0,开辟了内存中的独立空间
当通过celery发送任务的时候,发送的信息中不包含任何的任务函数的代码,只包含要执行任务的函数名称。这种模式类似本地的主机名在网页上被浏览器解析,
每一个任务函数都有一个名称与函数的映射,我们称之为task registry(任务注册表)
当你定义一个task函数的时候,这个task也会加到本地的注册表中
>>> @app.task ... def add(x, y): ... return x + y >>> add <@task: __main__.add> >>> add.name __main__.add >>> app.tasks['__main__.add'] <@task: __main__.add>
当celery不能确定函数属于哪个类的时候,会默认返回__main__,但是仅限于下面的两种情况:
- 一个模块以方法的形式定义,并在该模块运行
- 在python shell中运行
下面的例子:
from celery import Celery app = Celery() @app.task def add(x, y): return x + y if __name__ == '__main__': app.worker_main()
程序中 if __name__ == '__main__' 条件成立的时候,这时候在该程序中task.name是__main__,但是当其他程序进行调用该模块的时候task.name其实是下面的情况:
>>> from tasks import add >>> add.name tasks.add
扩展:
每一个task必须要有唯一的名字,默认的名称是文件的名称:如下面定义的task.py文件
@app.task def add(x, y): return x + y >>> from tasks import add >>> add.name 'tasks.add'
但是一般习惯将函数名来命名task,区分开不同的task:
>>> @app.task(name='sum-of-two-numbers') >>> def add(x, y): ... return x + y >>> add.name 'sum-of-two-numbers'
>>> @app.task(name='tasks.add') >>> def add(x, y): ... return x + y