分布式异步框架celery + Redis 安装配置

分布式异步框架celery + Redis 安装配置

码农世界 2024-05-24 后端 60 次浏览 0个评论

引入

这里不对web框架做过多说明,到时候在总结一篇分布式异步框架celery + Redis 安装配置

python的常见web框架

django、flask、tornado、sanic、fastapi..

各框架区别

- 内部集成功能的多少

  • django,内部提供了很多组件。 【相对大】
  • flask、tornado、sanic、fastapi… 本身自己功能很少+第三方组件。【相对小】

    - 同步框架 vs 异步非阻塞

    • 异步非阻塞框架框架

      • 异步非阻塞:tornado、sanic、fastapi、django

        分布式异步框架celery + Redis 安装配置

        缺点:实际上大部分网站不会有太多IO操作,所以可能用不上异步非阻塞框架

      • 同步框架

        • 同步:django、flask、bottle、webpy…

          分布式异步框架celery + Redis 安装配置

          大部分网站使用该框架,但IO操作耗时问题没有有效解决,所以后续引入celery的概念

          Celery介绍

          # 官网
          https://docs.celeryq.dev/en/stable/
          # github源码
          https://github.com/celery/celery
          

          是什么?

          1. celery 是一个灵活且可靠的,处理大量消息的分布式系统,可以在多个节点之间处理某个任务

            • 人话:实现了异步效果
            • 举例:现在有一个作业,你一个人做需要24h,而你与同学一起做需要12h,你找24个同学1h就做完了,当然你并没有这么多好同学◖⚆ᴥ⚆◗
            • celery 是一个专注于实时处理的任务队列,支持任务调度

            • celery 是开源的,有很多的使用者

            • celery 完全基于 Python 语言编写

            • 所以 celery 本质上是一个分布式的异步任务调度框架,类似于 Apache 的 airflow

              • 分布式:可以运行在不同的计算机节点上
              • 异步任务:同时干好多事
              • 框架
              • celery 只是用来调度任务的,但它本身并不具备存储任务的功能,而调度任务的时候肯定是要把任务存起来的。因此要使用 celery 的话,还需要搭配一些具备存储、访问功能的工具,比如:消息队列、Redis缓存、数据库等等。官方推荐的是消息队列 RabbitMQ,我们使用 Redis

                • 消息队列:Rabbitmq,Kafka

          使用场景

          1. 异步任务
            • 一些耗时的操作可以交给celery异步执行,而不用等着程序处理完才知道结果。
            • 视频转码、邮件发送、消息推送等等
            • 定时任务
              • 定时推送消息、定时爬取数据、定时统计数据等
              • 延迟任务
                • 提交任务后,等待一段时间再执行某个任务

          celery架构

          Celery 架构,它采用典型的生产者-消费者模式,主要由以下部分组成:

          1. Celery Beat,任务调度器,Beat 进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。

          2. Producer:需要在队列中进行的任务,一般由用户、触发器或其他操作将任务入队,然后交由 workers 进行处理。调用了 Celery 提供的 API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。

          3. Broker:即消息中间件,在这指任务队列本身,Celery 扮演生产者和消费者的角色,brokers 就是生产者和消费者存放/获取产品的地方(队列)。

          4. Celery Worker:执行任务的消费者,从队列中取出任务并执行。通常会在多台服务器运行多个消费者来提高执行效率。

          5. Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery不提供,但Celery 默认已支持 Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy 等方式。

          实际应用中,用户从 Web 前端发起一个请求,我们只需要将请求所要处理的任务丢入任务队列 broker 中,由空闲的 worker 去处理任务即可,处理的结果会暂存在后台数据库 backend 中。我们可以在一台机器或多台机器上同时起多个 worker 进程来实现分布式地并行处理任务。

          分布式异步框架celery + Redis 安装配置

          小结:

          - celery 分布式异步任务框架--》实现异步
          - 需要有redis支持,这个框架才能用
          - 同步调用 VS 异步调用
          

          分布式异步框架celery + Redis 安装配置

          Redis 安装配置

          常见的数据库,不做过多介绍

          下载Redis

          Redis默认支持的是Linux,如果win下载就使用下面链接跳转吧

          https://github.com/MicrosoftArchive/redis/releases

          分布式异步框架celery + Redis 安装配置

          • 注意:这里不建议使用Docker部署,可参考https://zhuanlan.zhihu.com/p/159229406

            安装Redis

            • 注意添加环境变量,不然你的操作系统可能不认识他。自定义位置

              分布式异步框架celery + Redis 安装配置

            • Redis 默认端口是6379分布式异步框架celery + Redis 安装配置
            • 无视

              分布式异步框架celery + Redis 安装配置

            • 打开终端
              # 看是否连接成功
              redis-cli
              # 成功会出现 127.0.0.1:6379>
              
              • 包错就执行就右键此电脑,点击管理—>打开服务分布式异步框架celery + Redis 安装配置
              • 点击R按回车可以快速找到Redis,右键启动

                分布式异步框架celery + Redis 安装配置

                再去cmd中redis-cli测试一下是否连接成功

                安装Redis GUI

                使用Redis图形化界面:

                1. Tiny PDM: 这款比较好看,我用的就这个https://github.com/tiny-craft/tiny-rdm
                2. 用pycharm内的也可以,自己折腾,我不会

                celery使用

                首先在python创建一个python项目,创建虚拟环境

                安装依赖

                # 2 安装celery
                pip install celery
                # 3 安装redis(消息队列和结果存储使用redis),这是用来让python认识redis的
                pip install redis
                # 4 安装eventlet(win 平台)
                pip install eventlet
                

                使用

                1. 编写celery_demo.py
                import time
                from celery import Celery
                broker = 'redis://127.0.0.1:6379/1'
                backend = 'redis://127.0.0.1:6379/2'
                app = Celery('demo', broker=broker, backend=backend)
                @app.task  # 被装饰器装饰了,才是celery的任务
                def add(a, b):
                   print('a+b的结果是', a + b)
                   time.sleep(1)# 模拟任务耗时
                   return a + b
                
                1. 提交任务add_task.py
                from celery_demo import add
                res = add.delay(7,8) # 只是提交,没有真正执行
                print(res)  # 获取的不是结果,是uuid
                
                1. redis中可以看到被提交的任务-没执行

                2. 启动worker执行任务,这是在终端执行的,注意文件夹结构,不对就cd进去

                # win:  celery -A celery_demo worker -l info -P eventlet
                celery -A <有app的py文件的名字> worker -l info -P eventlet
                # mac linux:  celery -A celery_demo worker -l info
                

                分布式异步框架celery + Redis 安装配置

                补充细节

                • 只有代码发生变化时需要,worker需要重启
                • 消息队列 vs 发布订阅
                  • 消息队列:第一个人得到第一个消息,就不会得到第二个消息,第二个人会得到第二个消息,后续同理分布式异步框架celery + Redis 安装配置 - 发布订阅:这个简单就不用画图了,就相当与一个人一订阅所有消息就全都可以看了,下一个人同理,还有就向你关注我一样,随时看我的学习笔记૮₍⑅˶•▿•˶⑅₎ა

                    结尾

                    后续会对数据库,django,celery,web框架做出笔记,拭目以待吧!

转载请注明来自码农世界,本文标题:《分布式异步框架celery + Redis 安装配置》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,60人围观)参与讨论

还没有评论,来说两句吧...

Top