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

引入

这里不对web框架做过多说明,到时候在总结一篇在这里插入图片描述

python的常见web框架

django、flask、tornado、sanic、fastapi..

各框架区别

- 内部集成功能的多少

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

- 同步框架 vs 异步非阻塞

  • 异步非阻塞框架框架

    • 异步非阻塞:tornado、sanic、fastapi、django
      在这里插入图片描述
      缺点:实际上大部分网站不会有太多IO操作,所以可能用不上异步非阻塞框架
  • 同步框架

    • 同步:django、flask、bottle、webpy…
      请添加图片描述
      大部分网站使用该框架,但IO操作耗时问题没有有效解决,所以后续引入celery的概念

Celery介绍

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

是什么?

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

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

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

  4. celery 完全基于 Python 语言编写

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

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

    • 消息队列:Rabbitmq,Kafka

使用场景

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

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支持,这个框架才能用
- 同步调用 VS 异步调用

在这里插入图片描述

Redis 安装配置

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

下载Redis

Redis默认支持的是Linux,如果win下载就使用下面链接跳转吧
https://github.com/MicrosoftArchive/redis/releases
在这里插入图片描述

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

安装Redis

  • 注意添加环境变量,不然你的操作系统可能不认识他。自定义位置
    在这里插入图片描述
  • Redis 默认端口是6379在这里插入图片描述
  • 无视
    在这里插入图片描述
  • 打开终端
# 看是否连接成功
redis-cli
# 成功会出现 127.0.0.1:6379>
  • 包错就执行就右键此电脑,点击管理—>打开服务在这里插入图片描述
  • 点击R按回车可以快速找到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

在这里插入图片描述

补充细节

  • 只有代码发生变化时需要,worker需要重启
  • 消息队列 vs 发布订阅
    • 消息队列:第一个人得到第一个消息,就不会得到第二个消息,第二个人会得到第二个消息,后续同理在这里插入图片描述 - 发布订阅:这个简单就不用画图了,就相当与一个人一订阅所有消息就全都可以看了,下一个人同理,还有就向你关注我一样,随时看我的学习笔记૮₍⑅˶•▿•˶⑅₎ა

结尾

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/633599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

【Unitydemo制作】音游制作—排行榜逻辑Json存储

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

查看当前Shell系统环境变量

查看当前Shell系统环境变量 查看命令 env效果 查看Shell变量(系统环境变量自定义变量函数) 命令 set效果 常用系统环境变量 变量名称含义PATH与windows环境变量PATH功能一样&#xff0c;设置命令的搜索路径&#xff0c;以冒号为分割HOME当前用户主目录&#xff1a;/rootSH…

day08-Java常用API

day08——Java常用API 一、今日内容介绍、API概述 各位同学&#xff0c;我们前面已经学习了面向对象编程&#xff0c;使用面向编程这个套路&#xff0c;我们需要自己写类&#xff0c;然后创建对象来解决问题。但是在以后的实际开发中&#xff0c;更多的时候&#xff0c;我们是…

通过 Spring 操作 Redis

要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 创建项⽬ 勾选 NoSQL 中的 Spring Data Redis 当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试. 配置 redis 服务地址 在 application.…

数据库的约束 not null, unique, default, primary key, foreign key, check

约束可以理解成 数据库提供的一种针对数据的合法性进行验证的机制, 在创建表的时候使用 1. 约束类型 NOT NULL - 指示某列不能存储 NULL 值, 表里的这个内容是必填项UNIQUE - 保证某列的每行必须有唯一的值, 不能重复 每次插入/修改时, 都要先触发查询, 如果当前插入/修改的…

mysql存储比特位

一、介绍 二、SQL CREATE TABLE bits_table (id INT PRIMARY KEY AUTO_INCREMENT,bit_value BIGINT UNSIGNED );-- 插入一个 8 位的 BIT 值 INSERT INTO bits_table (bit_value) VALUES (B10101010);-- 查询并格式化输出 SELECT id,bit_value,CONCAT(b, LPAD(BIN(bit_value),…

解决小皮面版搭建php网站数据库连接不了

首先进入mysql bin目录下 并执行cmd mysql -u root -pCREATE USER userlocalhost IDENTIFIED BY pass;GRANT ALL PRIVILEGES ON *.* TO userlocalhost;GRANT SELECT, INSERT, UPDATE ON database_name.* TO xxwlocalhost;FLUSH PRIVILEGES;select host ,user from mysql.user…

pdf文件怎么编辑?分享3个专业的pdf软件!

在数字化时代&#xff0c;PDF文件已成为我们工作、学习中的得力助手。然而&#xff0c;面对需要修改的PDF文件&#xff0c;许多人却感到无从下手。今天&#xff0c;就让我们一起探索如何轻松编辑PDF文件&#xff0c;并介绍几款实用的编辑软件&#xff0c;让你轻松应对各种PDF编…

Linux DAY 6 _systemctl

systemctl命令&#xff0c;通过这个命令控制系统操作 语法&#xff1a;systemctl start | stop | status | enable | disable 服务名 start 启动 stop 关闭 status 查看状态 enable 开启开机自启 disable 关闭开机自启 服务名&#xff1a; NetworkManager 主网络服务 net…

DFE_offset失调校准

1.校准原因 *制造工艺的限制&#xff1a;晶体管在制造过程中&#xff0c;由于工艺的限制&#xff0c;不可能做到完全对称&#xff0c;这导致了输入级晶体管的性能存在微小的差异。 *输入级偏置电流的不对称&#xff1a;输入级晶体管的偏置电流也会存在差异&#xff0c;这也会…

如何在OpenHarmony上使用SeetaFace2人脸识别库?

简介 相信大部分同学们都已了解或接触过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;了&#xff0c;但你一定没在OpenHarmony上实现过人脸识别功能&#xff0c;跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别。 项目效…

如何理解kmp的套娃式算法啊?

概念 KMP算法&#xff0c;全称Knuth Morris Pratt算法 。文章大部分内容出自《数据结构与算法之美》 核心思想 假设主串是a&#xff0c;模式串是b 在模式串与主串匹配的过程中&#xff0c;当遇到不可匹配的字符的时候&#xff0c;对已经对比过的字符&#xff0c;是否能找到…

向上调整建堆与向下调整建堆的时间复杂度 AND TopK问题

目录 前言建堆的时间复杂度TOPK问题总结 前言 本篇旨在介绍使用向上调整建堆与向下调整建堆的时间复杂度. 以及topk问题 博客主页: 酷酷学!!! 感谢关注~ 建堆的时间复杂度 堆排序是一种优于冒泡排序的算法, 那么在进行堆排序之前, 我们需要先创建堆, 为什么说堆排序的是优于…

YOLOv8绘制map曲线图

yolov8源码绘制的map曲线图不够清晰&#xff0c;python代码绘制的曲线图导入word之后清晰度也不够高&#xff0c;所以选择使用matlab来绘制曲线图&#xff0c;matlab可以直接复制图窗到word中&#xff0c;在转换成pdf也不会失真。点击编辑&#xff0c;复制图窗即可复制到word中…

【Linux】:Linux 2.6内核 调度队列和调度原理

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux 2.6内核 调度队列和调度原理&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a…

做抖店需要截流吗?聊下抖店的出单玩法和运营思路

我是王路飞。 做抖店需要截流吗&#xff1f; 关于抖店的玩法&#xff0c;一直都是众说纷纭&#xff0c;谁都想发表点自己的意见。 尤其是很多新手&#xff0c;可能以前接触过淘宝等传统电商&#xff0c;对截流等玩法有个基本了解&#xff0c;就认为抖店是不是也是这样玩的。…

使用Flask ORM进行数据库操作的技术指南

文章目录 安装Flask SQLAlchemy配置数据库连接创建模型类数据库操作插入数据查询数据更新数据删除数据 总结 Flask是一个轻量级的Python Web框架&#xff0c;其灵活性和易用性使其成为开发人员喜爱的选择。而ORM&#xff08;对象关系映射&#xff09;则是一种将数据库中的表与面…

免费开源人脸识别系统,支持RESTful API

简介 CompreFace 是一个免费开源的人脸识别项目&#xff0c;您不需要具备机器学习技能就能安装设置和使用 CompreFace&#xff0c;官方提供了基于 docker 的部署方法&#xff0c;可以方便地部署在本地或者云端服务器上。 CompreFace 提供了 RESTful API&#xff0c;用于人脸识别…

超详细的前后端实战项目(Spring系列加上vue3)(一步步实现+源码)前端篇(一)

最近想着一步步搭建一个前后端项目&#xff0c;将每一步详细的做出来。&#xff08;如果有不足或者建议&#xff0c;也希望大佬们指出哦&#xff09; 前端初始化 1.根据vue脚手架创建vue项目 这里可以用很多方法创建vue项目&#xff0c;大家看着创建吧&#xff0c;只要能创建…