前两天 搞通了 Celery 和RabbitMQ ,但是由于项目需要,需要加上Redis 来存储结果。
所以项目结构变成了RabbitMQ 当做broker, Redis 当做 backend.
关于Celery 和RabbitMQ 的安装与配置请参考celery+rabbitmq(Docker) quick start
配置Redis
Dockerfile
FROM redis COPY redis.conf /usr/local/etc/redis/redis.conf CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
redis.conf
#绑定的主机地址 #bind 0.0.0.0 #指定Redis监听端口,默认端口为6379 port 6379 tcp-backlog 511 timeout 70 tcp-keepalive 300 #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize yes #当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定 pidfile /root/redis/redis.pid # 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose loglevel notice #日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null logfile "/root/redis/redis.log" #设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id databases 16 #指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 # save <seconds> <changes> #Redis默认配置文件中提供了三个条件: #分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes #指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 rdbcompression yes rdbchecksum yes #指定本地数据库文件名,默认值为dump.rdb dbfilename dump.rdb #指定本地数据库存放目录 dir /root/redis slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 #指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区 maxmemory 32mb maxmemory-policy noeviction #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no appendonly yes appendfilename "appendonly.aof" #指定更新日志条件,共有3个可选值: # no:表示等操作系统进行数据缓存同步到磁盘(快) # always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) # everysec:表示每秒同步一次(折衷,默认值) # appendfsync everysec appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 cluster-enabled no cluster-config-file nodes.conf cluster-node-timeout 15000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
Build docker image
进入Dockerfile 和redis.conf 所在目录
docker build -t myredis .
然后启动docker容器
docker run -itd -v /你本机目录:/data -p 6379:6379 e95af6c47c4a redis-server
以上redis 配置完成
---------------
与celery 联动
tasks.py
from celery import Celery from flask import Flask, request Celeryapp = Celery('tasks', backend='redis://0.0.0.0:6379', broker='amqp://guest:[email protected]:5672//') #app = Celery('tasks', broker='amqp://guest:[email protected]:5672//') Flaskapp = Flask(__name__) @Flaskapp.route('/addtask') def add2(): x = request.args.get('x') y = request.args.get('y') add.delay(int(x), int(y)) return "finish" @Celeryapp.task def add(x,y): return x + y if __name__ == '__main__': Flaskapp.run('0.0.0.0')
基于前一篇的Celery与RabbitMQ的配置,这片博文加上了Redis 和python 的Flask 框架。
运行方法:
在tasks.py文件所在目录运行 (添加 worker)
celery -A tasks worker --loglevel=info
output
(py3env) hostname:test$ celery -A tasks worker --loglevel=info -------------- [email protected] v4.1.0 (latentcall) ---- **** ----- --- * *** * -- Darwin-17.5.0-x86_64-i386-64bit 2018-05-02 17:56:20 -- * - **** --- - ** ---------- [config] - ** ---------- .> app: tasks:0x1024b0f28 - ** ---------- .> transport: amqp://guest:**@127.0.0.1:5672// - ** ---------- .> results: disabled:// - *** --- * --- .> concurrency: 8 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . tasks.add [2018-05-02 17:56:21,248: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672// [2018-05-02 17:56:21,577: INFO/MainProcess] mingle: searching for neighbors [2018-05-02 17:56:23,798: INFO/MainProcess] mingle: all alone [2018-05-02 17:56:25,158: INFO/MainProcess] [email protected] ready.
运行flower
celery flower --broker=amqp://guest:[email protected]:5672//
添加任务
运行 tasks.py 文件
打开浏览器
http://0.0.0.0:5000/addtask?x=5&y=5
结果: