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

news2024/11/24 9:51:53

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 = 0

    def 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 message


async def response_sse(chat_generator):
    """
    发送请求的响应
    chat_generator: generator
    return: 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 = None
    return response

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

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

相关文章

聊一次线程池使用不当导致的生产故障-图文解析

聊一次线程池使用不当导致的生产故障–图文解析 原文作者:货拉拉技术团队 原文链接:https://juejin.cn/post/7382121812434747418 1 抢救 交代了背景:交付的软件运行中出现了故障,报警机制被触发,通过飞书与报警电…

《500 Lines or Less》(5)异步爬虫

https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html ——A. Jesse Jiryu Davis and Guido van Rossum 介绍 网络程序消耗的不是计算资源,而是打开许多缓慢的连接,解决此问题的现代方法是异步IO。 本章介绍一个简单的网络爬虫&a…

静止轨道卫星大气校正(Atmospheric Correction)和BRDF校正

文章内容仅用于自己知识学习和分享,如有侵权,还请联系并删除 :) 目的: TOA reflectance 转为 surface refletance。 主要包含两步: 1)大气校正; 2)BRDF校正 进度&#x…

C语言日常练习Day12(文件)

目录 一、从键盘输入一些字符,逐个把他们送到磁盘上去,直到用户输入#为止 二、输入连续几个正整数n和m,求其最大公约数和最小公倍数 三、将‘China’翻译成密码,密码规律是:用原来的字母后面第4个字符代替原来的字母…

C++初阶:string(字符串)

✨✨所属专栏:C✨✨ ✨✨作者主页:嶔某✨✨ 为什么要学习string类 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的&#…

springboot中使用knife4j访问接口文档的一系列问题

springboot中使用knife4j访问接口文档的一系列问题 1.个人介绍 🎉🎉🎉欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的…

鸿蒙(API 12 Beta2版)【创建NDK工程】

创建NDK工程 下面通过DevEco Studio的NDK工程模板,来演示如何创建一个NDK工程。 说明 不同DevEco Studio版本的向导界面、模板默认参数等会有所不同,请根据实际工程需要,创建工程或修改工程参数。 通过如下两种方式,打开工程创…

【软考】设计模式之生成器模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.生成器模式(Builder Pattern),也称为建造者模式,是设计模式中的一种创建型模式。2.将一个复杂对象的构建与它的表示分离,使得…

C++初学(2)

2.1、其他简单C语句例子 下面这个程序要求运行时输入值 #include <iostream> int main() {using namespace std;int yuanshi;cout << "How many yuanshi do you have?" << endl;cin >> yuanshi;cout << "Here are two more.&q…

数据结构——堆(C语言版)

树 树的概念&#xff1a; 树&#xff08;Tree&#xff09;是一种抽象数据结构&#xff0c;它由节点&#xff08;node&#xff09;的集合组成&#xff0c;这些节点通过边相连&#xff0c;把 节点集合按照逻辑顺序抽象成图像&#xff0c;看起来就像一个倒挂着的树&#xff0c;也…

15 Python常用内置函数——类型转换与类型判断

① 内置函数 bin()、oct()、hex() 用来将整数转换为二进制、八进制和十六进制形式&#xff0c;这3个函数都要求参数必须为整数。 print((bin(168), oct(168), hex(168))) # 把数字转换为二进制串、八进制串、十六进制串内置函数 int() 用来将其他形式的数字转换为整数&#x…

【计算机网络】HTTP协议实验

一&#xff1a;实验目的 1&#xff1a;理解HTTP协议的基本工作原理。 2&#xff1a;使用Wireshark或其他抓包工具捕获并分析HTTP数据包&#xff0c;理解HTTP通信的具体过程。 3&#xff1a;通过分析抓包数据&#xff0c;识别常见的HTTP状态码及其含义。 二&#xff1a;实验仪…

华为OD机试 - 数的分解 (Java/c++/python 2024年C卷D卷)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录(Java & c & python) 题目描述 给定一个正整数 n&#xff0c;如果能够分解为 m&#xff08;m > 1&#xff09;个连续正整数之和&#xff0c;请输出所有分解中&#xff0c;m最小的分解。 如果给定整数无法分…

Linux中的三类读写函数

文件IO和标准IO的区别 遵循标准&#xff1a; 文件IO遵循POSIX标准&#xff0c;主要在类UNIX环境下使用。标准IO遵循ANSI标准&#xff0c;具有更好的可移植性&#xff0c;可以在不同的操作系统上重新编译后运行。可移植性&#xff1a; 文件IO的可移植性相对较差&#xff0c;因为…

从丢失到找回:2024年U盘数据恢复软件全攻略

优盘作为我们日常短时间存储分享数据来说非常方便&#xff0c;毕竟小巧便携。但是也正因为他小巧数据很容易丢失&#xff0c;如果有备份还好&#xff0c;没有备份就麻烦了。但是只要掌握U盘数据恢复方法就可以缩小我们的损失。 1.福foxit昕数据恢复工具 一键直达>>http…

【ESP32 idf 硬件I2C驱动MPU6050获取六轴数值】

目录 I2C介绍配置安装驱动通信创建&删除命令链接容器起始时序写数据读数据结束时序开始命令 mpu6050 硬件i2c驱动代码&调试代码调试 I2C 介绍 介绍部分可以看我写的【ESP32 idf 软件模拟I2C驱动MPU6050实现六轴加速度的获取】&#xff0c;这个是使用软件模拟的I2C时序…

数据结构-C语言-排序(4)

代码位置&#xff1a; test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排…

找工作准备刷题Day10 回溯算法 (卡尔41期训练营 7.24)

回溯算法今天这几个题目做过&#xff0c;晚上有面试&#xff0c;今天水一水。 第一题&#xff1a;Leetcode77. 组合 题目描述 解题思路 从题目示例来看&#xff0c;k个数是不能重合的&#xff0c;但是题目没有明确说明这一点。 使用回溯算法解决此问题&#xff0c;利用树形…

设计模式-结构型-09-外观模式

文章目录 1、影院管理项目2、外观模式基本介绍4、MyBatis 框架源码分析5、外观模式总结 1、影院管理项目 组建一个家庭影院&#xff1a; DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机&#xff0c;要求完成使用家庭影院的功能&#xff0c;其过程为&#xff1a; 直接用…

推荐一个酷炫高逼格的服务器探针的监控工具,免费开源(附源码)

背景 作为一名攻城狮&#xff0c;面对各种服务器内存飙高、CPU猛增、磁盘打满等等服务器问题&#xff0c;可谓是伤透了我们的心。 不仅要开发&#xff0c;还要处理这些问题&#xff0c;大把的时间浪费了&#xff0c;这时候一个好的全面的监控工具尤为重要了。 所以&#xff…