Celery浅析,带你入门

原文链接: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’

指定任务名 tasks跟文件名一致

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

-- coding:utf-8 --

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

-- coding:utf-8 --

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

-- coding:utf-8 --

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

-- coding:utf-8 --

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 (未测试)

-- coding:utf-8 --

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

你可能感兴趣的:(Celery浅析,带你入门)