【后端开发实习】Python基于Quart框架实现SSE数据传输

Python基于Quart框架实现SSE数据传输

  • 前言
  • SSE简介
  • 理论分析
  • 代码实现

前言

在类似Chatgpt的应用中要实现数据的流式传输,模仿实现打字机效果,SSE是不二之选。传统的Flask框架不能满足异步处理的要求,没有异步处理就很难实现实时交互的需求,因此全新的Quart框架出现,但是Quart框架并没有原生好用的SSE类,官网只给出了如下的封装:
在这里插入图片描述

SSE简介

在这里插入图片描述

Server-Sent Events (SSE) 是一种基于 HTTP 的协议,服务器可以使用它来向客户端推送实时更新。在人工智能(AI)领域,SSE 的重要性主要体现在以下几个方面:

  1. 实时交互:在某些 AI 应用中,如聊天机器人、实时推荐系统等,需要服务器能够实时地向客户端推送新的信息或更新。SSE 提供了一种有效的方式来实现这种实时交互。

  2. 异步处理:AI 模型的计算过程可能会耗费一定的时间,特别是在处理大量数据或复杂模型时。通过 SSE,服务器可以在计算完成后立即将结果推送给客户端,而无需让客户端等待整个计算过程。

  3. 减少网络负载:相比于传统的轮询方式,SSE 可以大大减少网络请求的数量,从而降低服务器的负载。这对于处理大量实时数据的 AI 应用来说尤其重要。

  4. 易于实现和使用:SSE 是基于 HTTP 的,因此在大多数编程语言和框架中都很容易实现。此外,由于它是一种标准协议,因此客户端(如浏览器)通常也提供了对 SSE 的原生支持。

理论分析

Server-Sent Events (SSE) 是一种服务器向客户端推送数据的技术,它基于 HTTP 协议,允许服务器单向地向客户端发送事件。以下是 SSE 的数据传输格式和通信过程原理:

数据传输格式

SSE 使用纯文本格式发送数据,每个事件由一系列以换行符分隔的字段组成。每个字段都以字段名开始,后跟一个冒号和字段值。例如:

data: This is the first message.data: This is the second message.

这里,data 是一个字段,表示事件的数据。你也可以使用其他字段,如 event(指定事件类型)和 id(指定事件 ID)。

通信过程原理

  1. 建立连接:客户端通过发送一个 GET 请求到服务器上的某个 URL 来建立连接。这个请求的 Accept 头部字段应该设置为 text/event-stream,以告诉服务器客户端希望使用 SSE。

  2. 发送事件:一旦连接建立,服务器就可以开始发送事件。每个事件都是一个独立的消息,由一系列字段组成。服务器可以在任何时候发送事件,不需要客户端的请求。

  3. 接收事件:客户端通过监听 message 事件来接收服务器发送的事件。每当服务器发送一个事件,message 事件就会被触发,事件的数据可以通过事件对象的 data 属性获取。

  4. 断开和重新连接:如果连接被断开,客户端会自动尝试重新连接。你可以通过设置 retry 字段来控制重新连接的时间间隔。如果服务器发送了一个带有 id 字段的事件,那么在重新连接时,客户端会发送一个 Last-Event-ID 头部,值为最后一个接收到的事件的 ID,这样服务器就可以知道客户端接收到哪些事件。

因此需要定义如下四种内容:

  • data:数据内容
  • event:事件类型,一般是message
  • id:事件编号
  • retry:断开重传的时间

代码实现

from dataclasses import dataclass
from quart import make_response, json, Response@dataclass
class ServerSentEvent:"""Server Sent Event服务器服务端作用:将文本数据变成数据流传向客户端数据格式:data: string  传输数据内容, 公有变量event: string  传输事件类型, 私有变量id: string 事件id, 私有变量retry: int 断开重连时间, 私有变量"""_data: str_event: str = None_id: int = 0_retry: int = 0def encode(self):"""将数据转换成SSE的传输格式"""message = f"data: {self._data}"if self._event is not None:message = f"{message}\nevent: {self._event}"if self._id is not None:message = f"{message}\nid: {self._id}"if self._retry is not None:message = f"{message}\nretry: {self._retry}"message = f"{message}\n\n"return messageasync def response_sse(chat_generator):"""发送请求的响应chat_generator: generatorreturn: response"""async def send_events():"""将数据编码成SSE传输的格式进行传输"""# 遍历chat_generator获取其中的字符串内容for data in chat_generator:print("data in generator:"+data)event = ServerSentEvent(data)encoded_event = event.encode()yield encoded_event# 返回响应数据response = await make_response(send_events(),{'Content-Type': 'text/event-stream','Cache-Control': 'no-cache','Transfer-Encoding': 'chunked','Connection': 'keep-alive',},)response.timeout = Nonereturn response

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++客户端Qt开发——Qt窗口(对话框)

5.对话框 ①对话框介绍 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有:QFiledialog…

【第四天】计算机网络知识 HTTP1.0,HTTP1.1与HTTP2.0的区别 HTTP3.0

HTTP1.0,HTTP1.1与HTTP2.0的区别 HTTP1.0 默认是短链接,可以强制开启长连接。HTTP1.1默认长连接。HTTP2.0采用多路复用。 HTTP1.0: 默认使用短链接,每次请求都需要建立一个TCP连接。它可以设置:Connection: keep-aliv…

利用OSMnx求路网最短路径并可视化(二)

书接上回,为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化,我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图,并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…

洛谷 P9854 [CCC 2008 J1] Body Mass Index

这题让我们计算出 BMI 值,随后判断属于哪个等级。 BMI 值计算公式: ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​。 BMI 范围 对应信息 …

【JVM基础08】——类加载器-说一下类加载的执行过程?

目录 1- 引言:类加载的执行过程1-1 类加载的执行过程是什么?(What) 2- ⭐核心:详解类加载的执行过程(How)2-1 加载——>加载到运行时数据区2-2 验证——>类的安全性检查2-3 准备——>为类变量分配内存并设置初始值2-4 解析——>把…

Web网页端IM产品RainbowChat-Web的v7.1版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统)。 ► 详细介绍:http://www.52im.net/thread-2…

每天一个设计模式之职责链模式(第一天)

特别感谢刘伟老师,看他的书我学到了很多东西,从今天开始我要开始更新啦! 在csdn个人博客来总结知识,把他们变成自己的能力。 对三,要不起,张三李四王五几个人在玩斗地主,过过过,一…

Codeforces Round 962 (Div. 3)

链接 C题&#xff1a; 思路&#xff1a; 直接暴力求每个字母的前缀和&#xff0c;对于区间l&#xff0c;r的最小操作就是区间不同数的一半&#xff0c;因为可以把一个数变成另一个不一样的数&#xff0c;一下抵消两个。 #include<bits/stdc.h> using namespace std; //…

MySQL中不等于筛选时会漏掉null值的问题

一、问题描述 MySQL中使用不等于进行筛选数据时&#xff0c;若筛选值为null&#xff0c;则该条数据不会被选中&#xff0c;如何解决该问题&#xff1f; 表示不等于的方式如下&#xff1a; ! <> not in二、案例验证 1、创建数据表 -- ---------------------------- -…

【2024最新版】Stable diffusion汉化版安装教程(附SD安装包),一键激活,永久免费!

目前广泛使用的Stable Diffusion Web UI简称(SDWebUI)是发布在开源平台Github上的一个Python项目,与通常的软件安装方法不同,这个项目并不是下载并安装即可使用的应用程序,而是需要准备执行环境,编译源码. 如果你是一个新手不会安装,现在可以直接使用一键启动包. 例如:国内的…

AI驱动的在线面试系统:技术革新与初步面试的新体验

一、引言 在数字化和智能化的时代背景下&#xff0c;人工智能&#xff08;AI&#xff09;技术正日益渗透到各行各业&#xff0c;为人们的生活和工作带来前所未有的变革。其中&#xff0c;AI驱动的在线面试系统&#xff0c;凭借其高效、便捷、公正等特性&#xff0c;逐渐成为企业…

ATF-541M4全解析(一)

目录 一、描述二、规格三、各参数最大值四、25℃下的典型值 一、描述 安华高科技 (Avago Technologies) 的 ATF-541M4 是一款高线性度、低噪声、单电源供电的E-PHEMT&#xff0c;封装在一个微型无引脚封装中。 ATF-541M4 的小尺寸和低外形使其非常适合用于混合模块和其他空间…

matplotlib 画图函数,最常用的

并排显示2个图片 import os import numpy as np from PIL import Image import matplotlib.pyplot as pltimage1 Image.open(a.png) image2 Image.open(a2.png)# Create a figure with two subplots (1 row, 2 columns) fig, axes plt.subplots(1, 2, figsize(10, 5))# Di…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

git学习笔记(总结了常见命令与学习中遇到的问题和解决方法)

前言 最近学习完git&#xff0c;学习过程中也遇到了很多问题&#xff0c;这里给大家写一篇总结性的博客&#xff0c;主要大概讲述git命令和部分难点问题&#xff08;简单的知识点这里就不再重复讲解了&#xff09; 一.git概述 1.1什么是git Git是一个分布式的版本控制软件。…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

嵌入式C++、Raspberry Pi、LoRa和Wi-Fi技术、TensorFlow、ROS/ROS2:农业巡检数据导航机器人设计流程(代码示例)

随着科技的不断进步&#xff0c;农业领域也在逐渐向智能化发展。农业巡检机器人作为农业智能化的重要组成部分&#xff0c;能够自动化地监测农作物生长状况&#xff0c;提高农业管理的效率和精确度。本文将介绍一个基于Raspberry Pi和NVIDIA Jetson的农业巡检机器人&#xff0c…

【我的养猪日记】区块链游戏

剧情介绍 年少无知留给了故乡&#xff0c;谦卑有礼送给了远方&#xff0c;有工作的地方没家&#xff0c;有家的地方没工作&#xff0c;他乡留不下灵魂&#xff0c;故乡安不了肉身&#xff0c;从此便有了漂泊。在外漂泊数年的你每天过着&#xff0c;挤不完的公交地铁、交不完的房…

VUE3学习第三篇:报错记录

1、在我整理好前端代码框架后&#xff0c;而且也启动好了对应的后台服务&#xff0c;访问页面&#xff0c;正常。 2、报错ReferenceError: defineModel is not defined 学到这里报错了 在vue网站的演练场&#xff0c;使用没问题 但是在我自己的代码里就出问题了 3、watchEffec…

网友提问:桌面与web开发哪个难度更大?

关于桌面应用开发与Web开发哪个难度更大的问题&#xff0c;实际上并没有绝对的答案&#xff0c;因为这取决于具体的开发任务、所使用的工具和技术栈等因素。不过&#xff0c;我们可以从几个方面来进行比较&#xff1a; 技术栈 Web开发&#xff1a; 前端通常涉及到HTML、CSS、J…