【Python系列】浅析流式模式:基于 SSE 的实时响应体验

news2024/11/14 22:23:12

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 什么是流式模式?
    • SSE:流式模式的核心技术
      • SSE 的工作原理
      • SSE 的优势
    • 实现基于 SSE 的流式模式
      • 服务端的实现
      • 客户端的实现
    • 应用场景与流式模式的优势
    • 流式模式与 WebSocket 的对比
    • 流式模式的未来展望

在现代 Web 应用开发中,用户体验的优化是一个非常重要的目标,尤其是在涉及到实时数据更新的场景下。流式模式(Streaming Mode)作为一种高效的数据传输方式,能够让用户以打字机输出的形式获得流式返回的效果。这种方式通过 Server-Sent Events (SSE) 技术实现,带来了独特的用户体验。
在这里插入图片描述

什么是流式模式?

流式模式,顾名思义,即通过流的方式持续发送数据而不是一次性全部返回。与传统的 HTTP 请求模式不同,流式模式的特点在于服务器可以在连接打开后持续地向客户端发送数据。这种实时传输方式不仅可以加快数据的响应速度,还可以减少带宽占用,使得应用的运行更加流畅。

以打字机输出为例,假设我们在 Web 页面上输入一个查询请求,传统模式下,页面会等待服务器返回完整的结果才会显示。而在流式模式下,服务器会逐步发送数据,客户端可以立即将接收到的数据呈现在用户面前,产生一种“打字机”式的输出效果。这种方式显著提升了用户的等待体验,并让应用表现更加动态化和富有生命力。

SSE:流式模式的核心技术

流式模式的实现离不开 Server-Sent Events (SSE) 技术的支持。SSE 是一种在 Web 页面中从服务器向客户端推送实时更新的技术,属于 HTML5 标准之一。它允许服务器不断发送数据到客户端,而不需要客户端持续发起请求。在流式模式中,SSE 被广泛用于实现打字机输出的流式返回效果。

SSE 的工作原理

SSE 基于 HTTP 协议,通过简单的 GET 请求即可开启一个持久连接。服务器会使用 Content-Type: text/event-stream 来标记返回的数据流,随后可以通过定期发送数据保持连接。当数据到达客户端时,浏览器会自动触发 message 事件进行处理。SSE 支持的数据流格式较为简单,每条数据都以事件块的形式发送,并以双换行符结束。

SSE 的基本事件块格式如下:

event: 事件名称
data: 数据内容

每条事件都以 eventdata 两个字段组成,其中 data 是实际的传输内容,而 event 则用于标记事件的类型。客户端可以根据 event 的类型进行不同的处理,比如显示不同的内容或触发特定的交互效果。

SSE 的优势

SSE 与 WebSocket 都是常用于实时数据推送的技术,但相比 WebSocket,SSE 的优势在于实现简单、数据流控制更稳定且具有自动重连机制。对于需要单向数据流(即服务器向客户端推送)的场景,SSE 是一种轻量级而高效的选择。此外,SSE 还具有较好的兼容性,能够在主流浏览器中良好运行。

实现基于 SSE 的流式模式

在基于流式模式的 Web 应用中,我们可以使用 JavaScript 和服务器端的 SSE 支持来实现打字机输出效果。以下是一个简单的实现示例,展示了如何通过 SSE 在客户端实现流式数据接收和展示。

服务端的实现

我们假设服务器使用 FastAPI 框架,以下是一个简单的服务端代码示例:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time

app = FastAPI()

def generate_stream():
    for i in range(1, 11):
        yield f"data: Message {i}\n\n"
        time.sleep(1)

@app.get("/stream")
async def stream():
    return StreamingResponse(generate_stream(), media_type="text/event-stream")

在这个例子中,我们定义了一个 generate_stream 函数用于生成数据流,使用 yield 逐步发送消息内容。StreamingResponse 类用于将数据流作为响应发送给客户端,并指定 media_type="text/event-stream" 来标识这是一个 SSE 流。

客户端的实现

在客户端,我们可以使用 JavaScript 的 EventSource API 来接收数据流并实时展示:

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>SSE 流式模式示例</title>
  </head>
  <body>
    <h1>实时消息流</h1>
    <div id="messages"></div>

    <script>
      const messagesDiv = document.getElementById("messages");
      const eventSource = new EventSource("/stream");

      eventSource.onmessage = (event) => {
        const newMessage = document.createElement("p");
        newMessage.textContent = event.data;
        messagesDiv.appendChild(newMessage);
      };

      eventSource.onerror = () => {
        console.log("连接出错,正在重新连接...");
      };
    </script>
  </body>
</html>

在客户端 HTML 页面中,我们创建了一个 EventSource 对象用于连接服务端的 SSE 流。onmessage 事件处理器会在收到每条消息时将内容添加到页面中,从而产生实时更新的效果。这种实现方式简单而高效,让用户体验到类似打字机的逐行显示效果。

应用场景与流式模式的优势

流式模式的应用场景非常广泛,尤其适合需要快速响应和实时更新的应用程序:

  1. 实时数据监控:在金融交易、传感器数据监控等场景下,流式模式能够让用户实时获取数据,做出快速响应。

  2. 聊天应用:在即时通讯应用中,流式模式使得聊天消息可以即时到达,提升了聊天体验。

  3. 新闻推送:对于新闻网站或信息流应用,SSE 能够即时向用户推送最新内容,提升用户粘性。

  4. 流式问答系统:在智能问答系统中,流式模式可用于模拟回答生成的过程,提升交互的真实性和自然性。

流式模式与 WebSocket 的对比

尽管流式模式和 SSE 具有诸多优点,但在一些双向通信需求较高的场景中,WebSocket 可能会是更好的选择。与 SSE 的单向通信不同,WebSocket 支持客户端和服务器之间的双向通信,因此在一些聊天系统或在线游戏等需要双向互动的应用中更为适用。然而,对于纯粹的服务器到客户端的数据推送需求,SSE 更加轻量和高效。

流式模式的未来展望

随着前端技术的发展和用户对实时体验的需求不断增加,流式模式的应用将越来越广泛。SSE 在保证简单实现的同时提供了稳定的数据传输方式,未来有望在更多场景中被采用。此外,随着 HTTP/3 协议的逐渐普及,更低的延迟和更高的传输效率也会为流式模式的进一步优化带来新的机遇。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

Python3.11.9+selenium,选择证书用多线程+键盘enter解决

Python3.11.9+selenium,选择证书用多线程+键盘enter解决 1、遇到问题:弹出证书选择,无法点击确定 import pyautogui pyautogui.press(enter) 键盘enter也无法点击 2、解决办法:用多线程解决同时执行click链接和Enter点击证书的确定 1、点击操作 # # 通过文本链接文本…

前端开发快速进行 Mock 数据的方法

前端开发快速进行 Mock 数据的方法 在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它可以帮助开发者在没有后端接口的情况下快速推进项目进度。然而&#xff0c;在使用如 Mock.js 这样的工具时&#xff0c;开发者可能会遇…

Unity学习---IL2CPP打包时可能遇到的问题

写这篇主要是怕自己之后打包的时候出问题不知道怎么搞&#xff0c;所以记录一下。 问题一&#xff1a;类型裁剪 IL2CPP打包后会自动对Unity工程的dll进行裁剪&#xff0c;将代码中没有引用到的类型裁剪掉。特别是通过反射等方式调用一些类的时候&#xff0c;很容易出问题。 …

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班&#xff0c;有空闲时间。争取一天学一课&#xff0c;养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…

比ChatGPT更酷的AI工具

相较于寻找比ChatGPT更酷的AI工具&#xff0c;这听起来似乎是个挑战&#xff0c;因为ChatGPT已经以它强大的综合性能在AI界大名鼎鼎。然而&#xff0c;每个工具都有其独特的优势&#xff0c;特别是在特定的应用场景下&#xff0c;其他AI工具可能会展现出与ChatGPT不同的魅力。接…

微服务day08

Elasticsearch 需要安装elasticsearch和Kibana&#xff0c;应为Kibana中有一套控制台可以方便的进行操作。 安装elasticsearch 使用docker命令安装&#xff1a; docker run -d \ --name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ //设置他的运行内存空间&#x…

微软推出的AI无代码编程微应用平台GitHub Spark和国产AI原生无代码工具CodeFlying比到底咋样?

今天咱来聊聊前阵子第十届GitHub开发者大会上发布的AI无代码编程平台GitHub Spark和国产的AI原生无代码工具CodeFlying比起来有没有什么说法。 首先说GitHub Spark这个产品截止到目前为止都很低调呀&#xff0c;甚至没有引起国外主流媒体的广泛关注。 有可能是因为大家都被…

设计模式:工厂方法模式和策略模式

工厂方法模式 什么是开闭原则? 开闭原则是扩展开发,对修改关闭 简单工厂(不是设计模式而是一种编程的习惯) 有三个角色 抽象产品:定义了产品的规范,描述了产品的特性和功能.具体产品:实现或者继承抽象产品的子类具体工厂:提供了创建产品的方法,调用者通过该方法获取产品 实…

docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled

无数次的拉镜像让人崩溃&#xff1a; rootnode11:~/ragflow/docker# more rag.sh #export HTTP_PROXYhttp://192.168.207.127:7890 #export HTTPS_PROXYhttp://192.168.207.127:7890 #export NO_PROXYlocalhost,127.0.0.1,.aliyun.com docker compose -f docker-compose-gpu-C…

【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)

#IEEE出版|EI稳定检索#主讲嘉宾阵容强大&#xff01;多位外籍专家出席报告 2024健康大数据与智能医疗国际会议&#xff08;ICHIH 2024&#xff09;2024 International Conference on Health Big Data and Intelligent Healthcare 会议简介 2024健康大数据与智能医疗国际会议…

字符串处理指南:Air780E软件的全新视角

今天我会把 Air780E软件的字符串处理详细解析&#xff0c;指南如下&#xff1a; 1、Lua字符串介绍 关于字符串&#xff0c;Lua提供了一些灵活且强大的功能&#xff0c;一些入门知识如下&#xff1a; 1.1 字符串定义 在Lua中&#xff0c;字符串可以用单引号或双引号"来定…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …

再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生

最近阿里发布公告通知&#xff0c;停止对EasyExcel 更新和维护&#xff0c;EasyExcel 是一款知名的 Java Excel 工具库&#xff0c;由阿里巴巴开源&#xff0c;作者是玉霄&#xff0c;在 GitHub 上有 30k stars、7.5k forks。 据了解&#xff0c;EasyExcel作者玉霄)去年已经从…

Acrobat Pro DC 2023(pdf免费转化word)

所在位置 通过网盘分享的文件&#xff1a;Acrobat Pro DC 2023(64bit).tar 链接: https://pan.baidu.com/s/1_m8TT1rHTtp5YnU8F0QGXQ 提取码: 1234 --来自百度网盘超级会员v4的分享 安装流程 打开安装所在位置 进入安装程序 找到安装程序 进入后点击自定义安装&#xff0c;这里…

13载匠心独运,BI+AI启航新征程

13载匠心独运&#xff0c;BIAI启航新征程&#xff01; 思迈特的13年&#xff0c;是在坚守中持续创新&#xff0c;在创新中不断追求卓越&#xff0c;是在挑战与机遇并行中开创全新篇章的历程。感谢每一位陪伴走过这段旅程的人。展望未来&#xff0c;思迈特将继续以初心为舵、以…

【大数据学习 | HBASE高级】storeFile文件的合并

Compaction 操作分成下面两种&#xff1a; Minor Compaction&#xff1a;是选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile&#xff0c;对于删除、过期、多余版本的数据不进行清除。 Major Compaction&#xff1a;是指将所有的StoreFile合并成一个StoreFile&am…

git config是做什么的?

git config是做什么的&#xff1f; git config作用配置级别三种配置级别的介绍及使用&#xff0c;配置文件说明 使用说明git confi查看参数 默认/不使用这个参数 情况下 Git 使用哪个配置等级&#xff1f; 一些常见的行为查看配置信息设置配置信息删除配置信息 一些常用的配置信…

Warped Universe游戏即将在Sui上推出,为玩家提供多样化的游戏体验

Warped Games选择Sui作为其即将推出的创新多类型游戏Warped Universe的首选Web3技术。Warped Universe让玩家可以体验第三视角实时动作、回合制策略和基地建设等玩法。该游戏使用Unreal Engine 5开发&#xff0c;将借助Sui的技术使玩家能够拥有、交易和变现其游戏内资产。 War…

Autosar CP XCP规范导读

XCP 模块在汽车电子系统架构中起到重要作用,通过与多个模块的连接,实现了数据采集、校准、诊断等功能。它通过 RTE 进行控制,通过 PDUR 进行数据路由,通过通信硬件抽象层访问底层硬件,并与操作系统和其他相关模块协同工作,确保系统的稳定运行。 主要功能用途 通信协议支…