一. celery组件
实现一个异步的任务队列,最简单来看需要以下几个部分:任务消息的队列,任务执行者,任务结果存储
消息中间件
消息中间件即用来提供消息队列功能的组件,celery本身不提供,但是支持很多的类型的中间人:RabbitMQ, Redis, Mongodb, Django ORM等引擎。
任务执行者
任务执行者即worker,由celery提供的任务执行单元,这里就可以分布式的放在系统的各个节点中。实现并发的特性。
任务结果存储
用来存储任务运行的结果的组件,默认是没有的,可以自定义引擎,支持SQLAlchemy,cache, mongodb, redis等
二. celery的python简单使用
使用的环境为python2.7, redis3.0.7,这里准备使用redis作为消息中间件和结果存储。
1. 先定义tasks.py
from celery import Celery
app = Celery('tasks', backend="redis://127.0.0.1:6379/1", broker='redis://127.0.0.1:6379/0')
#app.conf.CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'
#app.conf.CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
@app.task
def add(x, y):
return x + y
Celery第一参数为Celery App的名字,backend为任务结果存储,broker为消息中间件,这里使用的redis引擎。
下面定义一个task,用来计算两个参数的和,并返回。
2. 启动worker
在tasks.py目录的命令行执行:
celery -A tasks worker --loglevel=info
可以看到如下信息:
可以看到worker的基本信息,app, transport, results ,可以看到默认通过prefork起了4个进程
接下来我们通过命令行调用tasks里面的add任务:
我们使用add.delay执行,传入参数5,6,通过返回值result的ready()方法可以得到是否执行成功,通过get得到任务执行的结果。
在worker那里,可以看到任务的添加和执行的过程:
基本python 的使用就这里了。
三. django下celery的简单使用
celery易于web框架集成,与很多web框架都有支持的第三方库:
这里使用django-celery, 通过pip安装好后,创建一个django项目后,在settings.py中增加如下代码:
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/1'
#BORKER_URL = 'django://'
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'djcelery',
#"kombu.transport.django",
...
)
settings.py中设置了broker的url,当然测试环境可以使用django作为broker,如果食用django作为broker,则在installed_apps中增加kombu.transport.django。
接下来,我们在自己的django的app里面创建一个tasks.py文件:
from celery import task
@task
def add(x, y):
return x + y
可以直接使用celery的task装饰器装饰定义的task,这样就告诉Celery这是一个task。
在settings.py中的djcelery.setup_loader()运行时,Celery便会查看所有INSTALLED_APPS中的app目录中的tasks.py文件,将所有标记task的function注册成celery task。
接下来启动workder,因为我们使用了django-celery,那么直接使用命令:
python manager.py celery worker --loglevel=info
即可启动worker,终端中的输出跟之前celery直接开启worker基本一致。
然后我们可以通过python manager.py shell 去调用add这个task:
通过worker的终端也能看到task的处理。
如果在settings.py中设置了CELERY_ALWAYS_EAGER=True,则执行task时,便不需加delay了。
四. django使用Celery实现定时任务
虽然使用crnotab可以在服务器上定时执行写好的脚本,celery提供了定时任务的功能,能够通过scheduler很好的跟django结合起来。
要是celery执行定时任务的方式很多种,我们采用将定时任务存储在django数据库中,我们需要在settings.py中配置:
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
然后就可以在django的admin管理页面看到如下:
可以通过配置Periodic tasks增加定时任务。
通过python manager.py celery beat开启定时任务。
参考链接:http://www.weiguda.com/blog/73/
http://my.oschina.net/zhangxu0512/blog/212447?fromerr=r098W69A
来源:oschina
链接:https://my.oschina.net/u/2299936/blog/669844