解释器:D:\360Downloads\py
基于python开发的分布式异步消息任务队列,可以轻松的实现任务的异步处理, 如果业务场景中需要用到异步任务,就可以考虑使用celery。Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redi。当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务。
Celery 4.x及以上不支持windows10
一、使用celery
1.工作流程 rabbitmq为broker 中间商
任务发送者发送任务给celery,celery返回给一个任务id,celery将任务发送给rabbitmq,worker在rabbittmq中取任务,完成后返回给rabbittmq,取结果时也是通过celery。Celery的默认broker是RabbitMQ。
2.安装
pip install celery
3.创建任务 celery_test
from celery import Celery
# tasks是给app起的名字
app = Celery('tasks',
broker='redis://localhost',
backend='redis://localhost') # backend 将结果写入redis
@app.task # 这是worker可以执行的任务
def add(x, y):
print("running...", x, y)
return x + y
@app.task
def cmd(cmdstr):
print(cmdstr)
4.启动Celery Worker开始监听并执行任务,在pycharm终端里
celery -A celery_test worker --loglevel=info
5.再打开一个cmd, 进行命令行模式,调用任务
在项目里开一个cmd命令框,输入python后,进行以下操作
from celery_test import add
# 发给远程执行
t1 = add.delay(4, 4)
t1.get() # 拿取执行结果,没有返回就阻塞
t1.get(timeout=1) # 不等待执行完毕,如果没有执行完毕 返回异常
t1.ready() # 检测是否执行完毕
二、在项目中使用celery
1.目录如下
proj/__init__.py
/celery1.py
/tasks.py
2.celery1.py内容
# 从python的安装包里导入
# from __future__ import absolute_import, unicode_literals
from celery import Celery
app = Celery('tasks',
# broker='amqp://',
# backend='amqp://',
broker='redis://localhost',
backend='redis://localhost',
include=['tasks'])
# Optional configuration, see the application user guide.
app.conf.update(
result_expires=3600,
)
if __name__ == '__main__':
app.start( )
3.tasks.py中的内容
# from __future__ import absolute_import, unicode_literals
# from .celery1 import app
from celery1 import app
@app.task
def add(x, y):
return x + y
@app.task
def mul(x, y):
return x * y
@app.task
def xsum(numbers):
return sum(numbers)
4.启动worker
celery -A tasks worker --loglevel=info
5.再打开cmd运行同上
from tasks import add
# 发给远程执行
t1 = add.delay(4, 4)
t2 = mul.delay(4, 4)
t1.get() # 拿取执行结果,没有返回就阻塞
t1.get(timeout=1) # 不等待执行完毕,如果没有执行完毕 返回异常
t1.ready() # 检测是否执行完毕
三、定时任务
celery支持定时任务,设定好任务的执行时间,celery就会定时自动执行, 这个定时任务模块叫celery beat
periodic_task.py
from celery import Celery
from celery.schedules import crontab
app = Celery()
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# Calls test('hello') every 10 seconds.
sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')
# Calls test('world') every 30 seconds
sender.add_periodic_task(30.0, test.s('world'), expires=10)
# Executes every Monday morning at 7:30 a.m.
sender.add_periodic_task(
crontab(hour=7, minute=30, day_of_week=1),
test.s('Happy Mondays!'),
)
@app.task
def test(arg):
print(arg)
将proj.periodic_task加入celery1.py的app = Celery中,include=['tasks','periodic_task']
,启动任务调度器 celery beat
celery -A periodic_task beat
启动celery worker来执行任务
celery -A periodic_task worker