安装和使用Redis
链接:
Redis 教程
http://www.runoob.com/redis/redis-install.html
Celery+python+redis异步执行定时任务
https://blog.youkuaiyun.com/apple9005/article/details/54430104
Python 并行分布式框架 Celery
https://blog.youkuaiyun.com/freeking101/article/details/74707619
把redis文件夹的路径加入环境变量,系统除了在当前文件夹路径下寻找,还会去环境变量的path下寻找。
启动命令:
\redis-server.exe
默认地址
127.0.0.1:6379
redis://@172.16.0.109:3306
redis坑:
- 启动的redis命令行窗口不能关
- redis set 的value虽然是字符串格式,但python3 读取之后会在前加b‘key’,redis.get(‘key‘)后需要decode 来转为utf-8格式的字符串。
https://blog.youkuaiyun.com/Lan_cer/article/details/84946330
demo测试:
坑1:redis 命令行启动后需一直开着
坑2:配置项目中文件命名有celery, 在celery.py中调用celery库之前,需加绝对引用。
from future import absolute_import, unicode_literals
from celery import Celery
https://www.cnblogs.com/jonathan1314/p/7649249.html
坑3:未知错误:
Celery ValueError: not enough values to unpack (expected 3, got 0)的解决方案
https://blog.youkuaiyun.com/qq_30242609/article/details/79047660
坑4:
路径问题
https://blog.youkuaiyun.com/xiongchengluo1129/article/details/80453599
python中路径前加r, 防止系统自动把/转化为//所引起的错误
坑5:Python引入同级包pycharm报错
不管他。。。terminal中能跑。。。
flask+celery:
坑6:‘Flask’ object has no attribute ‘user_options’
解决方法:
celery -A app.celery worker --loglevel=info
https://blog.youkuaiyun.com/lixingdefengzi/article/details/51769731
坑7:
API_file.tasks.celery 或XXX not register
celery 启动时激活的任务,和API中启动的任务必须一致。若接口调用的任务没有上层API_file这个目录,则激活celery时,需进入相应的API_file文件夹中,再启动单独的tasks.celery的任务。 若接口调用的有上级目录,celery激活时,就在大文件夹下启动API_file.tasks.celery任务。
python 中使用
pip install celery
pip install redis
pip install eventlet
pip install connexion 【swagger-ui】
在103虚拟机上运行报错:
-
connexion报错 编码错误
connexion库中swagger2 文件中log有中文会报错
解决方法 把日志内容用utf8编码,
str(log***).encode(“utf8”) -
celery库报错
from . import async,base 报错 invalid syntax,库名更改,新版celery已修复bug
解决:pip install --upgrade https://github.com/celery/celery/tarball/master
链接: https://www.jianshu.com/p/728a7d4daa5e
项目中使用celery
https://www.cnblogs.com/jonathan1314/p/7649249.html
在项目中,将配置文件和tasks文件分开,这样可以添加多任务。
celery.py配置文件命名也为celery, 故该文件中引用库文件celery之前,需加绝对引用。
加上绝对引用之后编辑器会报错,但是程序可以运行。
步骤一:启动redis
命令行命令:
redis-server.exe
(默认配置文件中设置host 127.0.0.1,端口6379)
example: ‘redis://127.0.0.1:6379/5’
步骤二:启动celery
新命令行中命令:
celery -A proj(项目名) worker --loglevel=info -P eventlet
步骤三:启动任务
新命令行中在proj同级目录下进入python
步骤四:分布式
当启动多个时 celery -A project worker -l info,去broker去相应任务,实现分布式
步骤五:后台启动worker
celery multi start w1 -A project -l info
celery multi start w2 -A project -l info
celery multi start w3 -A project -l info
celery multi restart w1 -A project -l info
celery multi stop w1 w2 w3 # 任务立刻停止
celery multi stopwait w1 w2 w3 # 任务执行完,停止
坑::: windows不支持
错误提示:This platform does not support detach。。。
flask+celery部署
- celery tasks任务文件 @celery.task 修饰需要异步执行的函数a
- 接口文件
@app.route() 修饰接口函数
在接口函数中调用函数a: a.delay()
以下均在terminal中运行
1.先运行API接口文件,启动服务
2. 新建terminal启动celery,register相应的tasks
3. 若是post接口,新terminal中运行虚拟客户端py文件,传入数据,调用API post接口函数。
坑:
注意app= Flask(name)
在单独的celery运用中,app=celery()
而flask+celery运用是,app一定是flask,然后才是celery=Celery(app.name,…)
对应的celery修饰器也改为@celery.task
@celery.task(bind=True) 表示默认,传入的第一个参数是他本身self
慎用,会报错
flask 简单接口部署
- swagger接口定义文件
- flask server启动服务文件
- swagger文件中operationId:写入要执行的“文件.函数”名
运行server文件启动服务。
web端进入对应host:port/ui 的swagger ui 界面,try it out 测试。