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__,但是仅限于下面的两种情况:
  1. 一个模块以方法的形式定义,并在该模块运行
  2. 在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

 

 

 

 
 
 
posted @ 2017-04-05 17:58  小步快跑&  阅读(197)  评论(0编辑  收藏  举报