参考资料来源:
https://www.cnblogs.com/alex3714/p/6351797.html
Celery的相关介绍和说明
Celery3.7的中文文档:
http://docs.jinkan.org/docs/celery/getting-started/first-steps-with-celery.html
1:Celery的作用主要是用于做相关的--异步任务神器
2:结合redis作为中间件主要用户任务的存储和处理结果的存储
Celery有以下优点(抄参考资料来源):
(1)简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
(2)高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
(3)快速:一个单进程的celery每分钟可处理上百万个任务
(4)灵活: 几乎celery的各个组件都可以被扩展及自定制
案例实践步骤
说明:该示例是实践参考https://www.cnblogs.com/alex3714/p/6351797.html
使用Redis做broker!
配置Redis作为中间件
相关格式:redis://:password@hostname:port/db_number
redis://:password@hostname:port/db_number
或
redis://localhost:6379/0
第1步:安装redis
(安装参考:https://www.jianshu.com/p/c450612c6295)
第2步:安装celery模块
# pip install celery
第3步:安装celery-with-redis或者直接安装reids模块模块
# pip install celery-with-redis
或
# pip install redis
第4步:启动redis-server服务
# redis-server /usr/local/redis/redis.conf
# 启动成功如图示:
[root@localhost ~]# ps -ef |grep redis
root 5620 1 0 03:06 ? 00:00:03 redis-server 0.0.0.0:6379
root 5795 5778 0 03:52 pts/2 00:00:00 grep --color=auto redis
[root@localhost ~]#
第5步:编写异步任务测试示例,命名为tasks.py
注:此地方示例使用到了python3,所以请先提前安装好python3的环境
# cd /data/app/celeryTest/
# touch tasks.py
# nano tasks.py
把下面的代码保存到tasks.py文件中
from celery import Celery
app = Celery('tasks',
broker='redis://:123456@localhost:6379/0',
backend='redis://:123456@localhost:6379/1')
@app.task
def add(x,y):
print("running...",x,y)
return x+y
代码片段说明:
broker='redis://localhost‘ :任务存贮
backend='redis://localhost':任务结果存贮
第6步:启动Celery Worker来开始监听并执行任务
注:执行启动任务需进入到tasks.py文件所在的目录下面
说明: 命令行执行celery worker -A <app> --loglevel=info时,<app>必须可导入,所以可以为PY模块或包,但需要注意的不管是包还是模块都必须正确指定Celery入口文件(如果为包则默认的入口文件名为celery.py)的绝对导入名称(app/work.app),Celery通过动态导入获取实例化后的应用,通过实例化时指定的配置以及include来依次导入任务执行文件中的任务指定单元,然后就是等待任务,可以看出Celery是通过相对/绝对导入来查找定义的任务执行单元,PY导入成功后会生成PYC文件,所以代码修改后一定要先删除PYC文件.(来源:http://blog.51cto.com/xmdevops/1885857)
#cd /data/app/celeryTest/
# celery -A tasks worker --loglevel=info
**--broker** URL(transport)是我们在celery模块中指定的broker关键字参数,你也可以通过-b选项在命令行指定一个不同的broker.
**--concurrency **是用来执行任务而prefork的worker进程,如果所有的worker都在执行任务,那么新添加的任务必须要等待有一个正在执行的任务完成后才能被执行。
默认的concurrency数量是机器上CPU的数量,你可以指定一个数量通过-c选项([
celery worker -c](http://docs.celeryproject.org/en/master/reference/celery.bin.worker.html#cmdoption-celery-worker-c) )。在这里没有推荐值,因为最优值依懒许多因素,但是如果你的任务大部分都是I/O相关的,你可以尝试增加这个值,实验证明增加到2倍以上于CPU数的值对性能提高微乎其微,相反还会降低性能。
除了默认的进程池,Celery还支持使用Eventlet,Gevent和线程(查看 Concurrency)
--Events是一个选项,它可以用来使Celery在worker中有事件发生时发送监控消息(events)。这些信息可以被一些监控程序使用,比如celery events和Flower---一个实时的Celery monitor,更多详细介绍可以查看Monitoring and Management guide.
--Queuens是一个队列列表,workers将会从中消费任务。可以告诉worker一次性地从多个队列中消费任务,这可以用来路由消息给指定的worker。这对于构建高质量的服务,关系的分离和提供优先级都有意义。具体的描述参考Routing Guide.
第7步:开启新的会话窗口
启动Celery Worker来开始监听并执行任务窗口:
派发任务给Celery Worker窗口:
第8步:(非必须)查看任务结果
看你的worker终端会显示收到 一个任务,此时你想看任务结果的话,需要在调用 任务时 赋值个变量
>>> result = add.delay(4, 4)
远程连接redis查看对应信息: