Celery+python+redis异步执行定时任务

安装和使用Redis

链接:
Redis 教程
http://www.runoob.com/redis/redis-install.html
Celery+python+redis异步执行定时任务
https://blog.csdn.net/apple9005/article/details/54430104
Python 并行分布式框架 Celery
https://blog.csdn.net/freeking101/article/details/74707619
把redis文件夹的路径加入环境变量,系统除了在当前文件夹路径下寻找,还会去环境变量的path下寻找。
启动命令:
\redis-server.exe
默认地址
127.0.0.1:6379
redis://@172.16.0.109:3306

redis坑:

  1. 启动的redis命令行窗口不能关
  2. redis set 的value虽然是字符串格式,但python3 读取之后会在前加b‘key’,redis.get(‘key‘)后需要decode 来转为utf-8格式的字符串。
    https://blog.csdn.net/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.csdn.net/qq_30242609/article/details/79047660

坑4:
路径问题
https://blog.csdn.net/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.csdn.net/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虚拟机上运行报错:

  1. connexion报错 编码错误
    connexion库中swagger2 文件中log有中文会报错
    解决方法 把日志内容用utf8编码,
    str(log***).encode(“utf8”)

  2. 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部署

  1. celery tasks任务文件 @celery.task 修饰需要异步执行的函数a
  2. 接口文件
    @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 简单接口部署

  1. swagger接口定义文件
  2. flask server启动服务文件
  3. swagger文件中operationId:写入要执行的“文件.函数”名

运行server文件启动服务。
web端进入对应host:port/ui 的swagger ui 界面,try it out 测试。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Celery是一个Python分布式任务队列,它可以帮助我们异步执行任务,而且还可以定时执行任务。下面是使用Django的Celery框架来实现定时任务执行的步骤: 1. 安装Celery。可以使用pip工具来安装Celery。 ```bash pip install celery ``` 2. 配置Django项目。在Django项目的settings.py文件中加入以下配置: ```python INSTALLED_APPS = [ # ... 'django_celery_results', 'django_celery_beat', # ... ] CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'django-db' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_SERIALIZER = 'json' ``` 其中,CELERY_BROKER_URL是指定Celery使用Redis作为消息代理,CELERY_RESULT_BACKEND是指定Celery的结果存储方式为Django数据库,CELERY_ACCEPT_CONTENT、CELERY_RESULT_SERIALIZER和CELERY_TASK_SERIALIZER则是指定消息的序列化方式。 3. 创建定时任务。在Django项目的tasks.py文件中定义需要定时执行的任务。例如: ```python from celery import shared_task @shared_task def hello(): print('Hello, World!') ``` 4. 配置定时任务。在Django项目的settings.py文件中加入以下配置: ```python CELERY_BEAT_SCHEDULE = { 'hello_task': { 'task': 'tasks.hello', 'schedule': 10.0, }, } ``` 其中,'hello_task'是任务的名称,'task'指定了任务的函数名,'schedule'则指定了任务的执行间隔时间。 5. 启动Celery。在Django项目的根目录下执行以下命令启动Celery: ```bash celery -A your_project_name worker -l info -B ``` 其中,-A参数指定了Celery要加载的Django项目的名称,-B参数表示启用定时任务。 6. 测试定时任务是否生效。等待10秒钟后,可以在控制台看到输出了'Hello, World!',表示定时任务已经成功执行。 以上就是使用Django的Celery框架来实现定时任务执行的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值