celery一:celery基础
一、celery介绍
celery,是一个分布式异步消息任务队列,通过它可以轻松的实现异步处理。
使用场景:如果业务场景中需要用到异步任务或定时任务,就可以考虑使用celery。
场景一:异步任务。对100台电脑执行一条批量命令,可能花很多时间,但你不想让你的程序等着结果返回,
而是给你返回一个任务ID,过些时间只需要拿着这个任务ID就可以查到任务执行结果;在任务执行时,
你可以继续做其它的事情。
场景二:定时任务。
中间件:celery在执行任务时,需要通过一个消息中件间来接收和发送任务信息,以及存储任务结果。
一般中间件使用rabbitMQ,redis。
celery优点:
1.配置和使用简单
2.高可用:当任务执行失败或执行过程中发生连接中断,celery会自动尝试重新执行任务
3.快速:一个单进程的celery,每分钟可以处理上百万个任务
4.灵活:可以随意增加插件
二、安装python之celery包:
pip install celery
三、安装python之中单间件包,和配置中间件
配置中件间,仅需一行就可以:
安装rabbitMQ中件间:
rabbitMQ配置:
broken_url = "amqp://user:password@localhost:5672//"
安装redis中间件: pip install -U "celery[redis]"
redis配置:
broker_url = "redis://:password@localhost:6379/0"
四、启动redis服务器
安装redis:
启动redis服务器:/etc/init.d/redis-server start
要注意持久化配置:vim /etc/redis/redis.conf
默认配置:
save 900 1
save 300 10
save 60 10000
五、一个简单的celery示例
前提:启动redis
# 文件:task.py
# 第一步:创建celery app,创建任务函数
from celery import Celery app = Celery('tasks', broker='redis://192.168.10.15', backend='redis://192.168.10.15') @app.task def add(x, y): print 'running..........', x, y return x +y
# 第二步:启动一个celery worker,当然可以启动多个worker(开多个窗口):
进入task.py所在目录,-A的参数tasks指的就是task.py文件
celery -A task worker --logleverl=info
# 第三步:调用任务:
from tasks import add add.delay(3, 5)
在windows下, 如果出现错误:没有足够的参数解构 tasks, accept, hostname = _loc,则启动worker时,添加--pool参数
celery -A task worker --loglevel=info --pool=solo
# 第四步:查看执行过程和结果
# 查看1---worker:此时worker终端会显示收到一个任务,执行了一个任务
[2018-08-26 10:46:31,569: INFO/MainProcess] Received task: task.add[2749585a-fddd-41ad-ad04-2de1447d066c] [2018-08-26 10:46:31,571: WARNING/MainProcess] running......... [2018-08-26 10:46:31,571: WARNING/MainProcess] 3 [2018-08-26 10:46:31,572: WARNING/MainProcess] 5 [2018-08-26 10:46:31,575: INFO/MainProcess] Task task.add[2749585a-0fddd-41ad-ad4-2de1447d066c] succeeded in 0.01599999999962165s: 8
# 查看2--redis中的结果:
redis-clis
auth pwddsdsddaf
keys *
将看到一个key为 "clery-task-meta-"开头的key,后面是task_id
查看key的value,即可看到任务执行的结果:
get "celery-task-meta-2749585a-fddd-41ad-ad04-2de1447d066c"
可以看到value是:
"{\"status\": \"SUCCESS\", \"result\": 8, \"traceback\": null, \"children\": [], \"task_id\": \"2749585a-fddd-41ad-ad04-2de1447d066c\"}"
结果是json字符串,取出来使用的时侯,要jason.loads():
data = json.loads("{\"status\": \"SUCCESS\", \"result\": 8, \"traceback\": null, \"children\": [],
\"task_id\": \"2749585a-fddd-41ad-ad04-2de1447d066c\"}") print(data) # {'status': 'SUCCESS', 'result': 8, 'traceback': None, 'children': [], 'task_id': '2749585a-fddd-41ad-ad04-2de1447d066c'}
# 查看3--代码中的结果:
# 如果要想在代码中接收任务结果,需要在调用任务的时侯,用变量接收执行任务的结果:
from tasks import add result = add.delay(3, 5)
# result结果,是一个对象:
result.ready() # 结果是否准备好,即是否执行完成
result.get() # 获取结果;如果有异常,会抛出异常,将导致代码抛出异常
result.get(timeou=1) # 获取结果;如果超时未获取到结果,则抛出异常
result.get(propagate=False) #获取结果;如果有异常,不抛出异常,返回错误信息
result.traceback # 获取异常信息
from task import add result = add.delay(3, 5) print("task_id: ", result.task_id) data = result.get(propagate=False) print("result: ", data) # task_id: 86d4422f-ae2b-484b-83ca-c287ddb54abc # result: 8
posted on 2018-08-18 14:00 myworldworld 阅读(647) 评论(0) 收藏 举报