原文链接:https://my.oschina.net/vhacker/blog/790300
Celery 简介
Celery是一个异步任务的调度工具。 可以提供消息队列的后台执行方式,也可以提供跟进时间的计划任务。 官方文档 Celery 用消息通信,通常使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,之后中间人把消息派送给职程。
broker
是一个消息传输的中间件,异步程序调用celery任务的时候,会向broker传递消息,存储消息队列,之后worker进行消息的消费。
backend
用于存储这些消息以及celery的一下直接结果和执行信息。
使用celery需要三个条件
1.定义任务函数
2.运行celery服务
3.客户端程序调用
以下在Windows下测试通过
创建文件 tasks.py
from celery import Celery
broker = ‘redis://127.0.0.1:6379/5’
backend = ‘redis://127.0.0.1:6379/6’
app = Celery(‘tasks’, broker=broker, backend=backend)
@app.task
def add(x, y):
return x + y
运行命令:
celery -A tasks worker --loglevel=info
程序调用:
In [0]:from tasks import add
In [1]: r = add.delay(2, 2)
In [2]: add.delay(2, 2)
Out[2]:
In [3]: r = add.delay(3, 3)
In [4]: r.ready()
Out[4]: True
定时任务
以上是celery的简单配置,重在理解原理,以下加入配置文件方式。 创建python包,命名为proj:
☁ proj tree
.
├── init.py
├── celery.py # 创建 celery 实例
├── config.py # 配置文件
└── tasks.py # 任务函数
celery.py
from future import absolute_import
from celery import Celery
app = Celery(‘proj’, include=[‘proj.tasks’])
app.config_from_object(‘proj.config’)
if name == ‘main’:
app.start()
config.py
from future import absolute_import
CELERY_RESULT_BACKEND = ‘redis://127.0.0.1:6379/5’
BROKER_URL = ‘redis://127.0.0.1:6379/6’
tasks.py
from future import absolute_import
from proj.celery import app
@app.task
def add(x, y):
return x + y
运行命令:
celery -A proj worker -l info
程序调用:
from proj.tasks import add
…
(同上)
Scheduler
每隔一段时间执行一次任务 config.py
from future import absolute_import
CELERY_RESULT_BACKEND = ‘redis://127.0.0.1:6379/5’
BROKER_URL = ‘redis://127.0.0.1:6379/6’
CELERY_TIMEZONE = ‘Asia/Shanghai’
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
‘add-every-30-seconds’: {
‘task’: ‘proj.tasks.add’, #这里注意路径
‘schedule’: timedelta(seconds=30),
‘args’: (16, 16)
},
}
一旦使用了 scheduler, 启动 celery需要加上-B 参数在Windows下需要另开一个终端分别运行。
celery -A proj worker -l info
celery -A proj beat -s celerybeat-schedule
Crontab
config.py (未测试)
from future import absolute_import
CELERY_RESULT_BACKEND = ‘redis://127.0.0.1:6379/5’
BROKER_URL = ‘redis://127.0.0.1:6379/6’
CELERY_TIMEZONE = ‘Asia/Shanghai’
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
# Executes every Monday morning at 7:30 A.M
‘add-every-monday-morning’: {
‘task’: ‘tasks.add’,
‘schedule’: crontab(hour=7, minute=30, day_of_week=1),
‘args’: (16, 16),
},
}
转载于:https://my.oschina.net/vhacker/blog/790300