python异步任务处理库celery
0.安装方式
pip install celery
一、单文件模式 基本使用
下面先直接上代码,再慢慢说明
异步任务文件 :
task.py
from celery import Celery # 创建应用APP tasks当前文件名相当于当前文件被引入时的__name__ # borker 负责携程队列的中间人 负责协调消费者和生产者 利用redis中的列表类型Lpush, Rpush也能完成 此处使用mq # backend 记录任务处理结果的数据库或者其他组件 # 如果要指定redis 端口账号密码的方式为密码 地址 端口号 选择数据库号 选择6 # 'redis://:密码@127.0.0.1:6379/6' app = Celery('tasks', broker='amqp://guest@localhost//', backend='redis://localhost') @app.task def add(x, y): # 一个异步实例,相当于消费者 return x + y
此时创建了一个异步任务文件:
其他文件可以通过 from tasks import add 导入这个异步实例
通过 add.delay(a,b)传入实参a,b进行调用调用异步任务实例(生产者)
form tasks import add # 放入中间人队列等待任务进程(消费者)调度 result = add.delay(4,5) # 打印任务的id执行完毕会存到backend id可以用于异步地适时地获取执行结果 print(result) # <AsyncResult: 6fdb0629-4beb-4eb7-be47-f22be1395e1d> # 通过ready查看是否任务执行完毕 result.ready() # false 还未执行完毕 # 延时一秒 等待 result.get(timeout=1) # 9
执行完毕
现在让我们来看看作为backend的redis发生了什么
连接redis数据库
输入一下命令
select 6(选择的数据库号码 默认0)
keys * (显示所有的key)
是不是似曾相识呢?
没错就是我们key的后缀部分就是我们的上次执行的任务id
下面我们获取一下key的值让我们更了解整个机制
(由于没有准备文件,我们就当是9吧!)
显然这个key存放了本次异步任务执行的结果信息
以上就是单个执行与运行机制了文件的执行过程了
二、多文件 目录模式
这里提供一个实例 供大家参考
init.py
这个没什么好说的了 空目录 识别为一个包
celery.py (APP引用文件)
from __future__ import absolute_import from celery import Celery # 当前目录名 任务实例所在的文件 app = Celery('celery_proj', include=['celery_proj.tasks']) # 引入配置文件的目录 app.config_from_object('celery_proj.config') if __name__ == '__main__': app.start()
config.py (参数配置文件)
from __future__ import absolute_import from datetime import timedelta # 假设中间人和结果后端都使用redis 数据库密码为123456 CELERY_RESULT_BACKEND = 'redis://:123456@@127.0.0.1:6379/6' BROKER_URL = 'redis://:123456@@127.0.0.1:6379/5' ''' 设置定期执行任务 每30秒添加一次队列,一分钟后执行 (注释不启动) CELERY_TIMEZONE = 'Asia/Shanghai' CELERYBEAT_SCHEDULE = { 'add-every-30-seconds': { 'task': 'celery_proj.tasks.add', 'schedule': timedelta(minutes=1), 'args': (5,1) # task.add的调用参数 }, } '''
tasks.py (任务实例文件,消费者模型)
from __future__ import absolute_import from celery_proj.celery import app @app.task def add(x,y): # 消费者函数 返回的结果会存储到结果后端 用户可以去结果后端backend中自行查找访问结果 # 我们在单文件的匹配模式下 已经介绍backend发生了什么 return x+y