当前位置: 首页 > article >正文

SSE协议介绍和python实现

概述:

  • SSE(Server-Sent Events)协议是一种允许服务器向客户端实时推送更新的技术,基于HTTP协议,常用于实时数据推送
  • 特点:
    • 单向通信:服务器向客户端推送数据,客户端无法发送数据。
    • 基于HTTP:使用简单,无需额外协议。
    • 长连接:保持连接,服务器可随时推送数据。
    • 自动重连:连接中断时,客户端会自动尝试重连。
  • 数据以文本格式发送,每条消息以\n\n结尾。

SSE和WebSocket区别

特性SSEWebSocket
通信方向单向(服务器 → 客户端)双向(服务器 ↔ 客户端)
协议基础基于 HTTP基于 WebSocket 协议
数据格式文本(data: <message>\n\n文本或二进制
自动重连内置支持需手动实现
性能适合低频、轻量级推送适合高频、双向通信
浏览器兼容性普遍支持,部分老的IE不支持普遍支持
使用场景实时通知、数据展示、进度更新等实时聊天、游戏、协同编辑
实现复杂度简单较复杂

简单实现

  • 下面是fastapi写的一个demo
import asynciofrom fastapi import FastAPI
from starlette.responses import StreamingResponseapp = FastAPI()# 模拟一个异步数据源
async def generate_data():for i in range(10):await asyncio.sleep(1)  # 模拟延迟yield f"data: Message {i}\n\n"  # SSE 格式的数据yield "data: Done\n\n"  # 结束标志# SSE 接口
@app.get("/sse")
async def sse():return StreamingResponse(generate_data(),media_type="text/event-stream",  # 设置媒体类型为 SSE)

用postman直接调用接口http://127.0.0.1:8000/sse

在这里插入图片描述

如果打开相应头,会发现里面的content-type:text/event-stream,标记了返回数据为流式数据

字段含义

  • SSE 数据以纯文本格式传输,每条消息由若干字段组成,字段之间用换行符(\n)分隔,每条消息以两个换行符(\n\n)结尾。常用字段包括:

    • data::消息内容(必填)。

    • event::事件类型(可选)。

    • id::消息 ID(可选)。

    • retry::重连时间(可选)。

  • 将消息内容改成如下,真正的消息只有data中的内容

async def generate_data():for i in range(10):await asyncio.sleep(1)  # 模拟延迟# 发送消息,包含 retry 字段(设置重连时间为 3000 毫秒)yield f"event: update\nid: {i}\nretry: 3000\ndata: Message {i}\n\n"yield "data: END\n\n"  # 结束标志

接入deepseek

如果你用过AI大模型,不难发现AI回答问题一般都是流式输出的,不断接受消息并进行Markdown的渲染,我这里接入deepseek并简单做了一个接口

import asyncio
import osimport replicate
from fastapi import FastAPI
from starlette.responses import StreamingResponseapp = FastAPI()async def deepseek_generate_data(question: str):os.environ["REPLICATE_API_TOKEN"] = "your_secret_key"input = {"top_p": 1,"prompt": question,"max_tokens": 20480,"temperature": 0.1,"presence_penalty": 0,"frequency_penalty": 0}try:for event in replicate.stream("deepseek-ai/deepseek-r1", input=input):yield f"retry: 5000\ndata: {event}\n\n"yield "data: END\n\n"  # 结束标志except Exception as e:yield f"data: {str(e)}\n\n"yield "data: END\n\n"  # 结束标志# SSE 接口
@app.get("/sse")
async def sse(question: str):return StreamingResponse(deepseek_generate_data(question),media_type="text/event-stream",  # 设置媒体类型为 SSE)

相关文章:

SSE协议介绍和python实现

概述&#xff1a; SSE&#xff08;Server-Sent Events&#xff09;协议是一种允许服务器向客户端实时推送更新的技术&#xff0c;基于HTTP协议&#xff0c;常用于实时数据推送特点&#xff1a; 单向通信&#xff1a;服务器向客户端推送数据&#xff0c;客户端无法发送数据。基…...

甘肃旅游服务平台+论文源码视频演示

4 系统设计 4.1系统概要设计 甘肃旅游服务平台并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的小程序结构&am…...

Spring Boot 3虚拟线程的使用

在Spring Boot非Web应用中&#xff0c;使用虚拟线程时程序提前终止的问题及解决方案&#xff0c;可以通过以下步骤深入理解和验证&#xff1a; 问题根源分析 JVM退出机制 Java中&#xff0c;当所有非守护线程结束时&#xff0c;JVM会立即退出。即使存在正在运行的守护线程&…...

3、pytest实现参数化

在 pytest 中&#xff0c;参数化&#xff08;parametrization&#xff09;是一种强大的功能&#xff0c;可以让你用不同的输入数据重复执行同一个测试函数。这种功能非常有用&#xff0c;可以帮助你显著减少重复代码并提高测试覆盖率。 参数化的主要作用是&#xff1a; 测试多…...

【解决】Linux命令报错:Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

报错命令 yum install zabbix-web-mysql-scl zabbix-apache-conf-scl centos使用scl切换软件版本时提示Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 报错原因 CentOS7的SCL源在2024年6月30日停止维护了。 当scl源里面默认使用了centos官方的地址&#x…...

WebRTC中音视频服务质量QoS之FEC+NACK调用流程

WebRTC中音视频服务质量QoS之FECNACK调用流程 WebRTC中音视频服务质量QoS之FECNACK调用流程 WebRTC中音视频服务质量QoS之FECNACK调用流程前言一、WebRTC中FEC基础原理1. FEC基础操作 异或操作XOR2、 FEC中 行向和纵向 计算3、 WebRTC中 媒体包分组和生成FEC的包数① kFecRateT…...

神经网络知识点整理

目录 ​一、深度学习基础与流程 二、神经网络基础组件 三、卷积神经网络&#xff08;CNN&#xff09;​编辑 四、循环神经网络&#xff08;RNN&#xff09;与LSTM 五、优化技巧与调参 六、应用场景与前沿​编辑 七、总结与展望​编辑 一、深度学习基础与流程 机器学习流…...

远程办公新体验:用触屏手机流畅操作电脑桌面

在数字化浪潮的推动下&#xff0c;远程办公已从“应急选项”转变为职场常态。无论是居家隔离、差旅途中&#xff0c;还是咖啡厅临时办公&#xff0c;高效连接公司电脑的需求从未如此迫切。然而&#xff0c;传统的远程控制软件常因操作复杂、画面卡顿或功能限制而影响效率。如今…...

【面试八股】:常见的锁策略

常见的锁策略 synchronized &#xff08;标准库的锁不够你用了&#xff09;锁策略和 Java 不强相关&#xff0c;其他语言涉及到锁&#xff0c;也有这样的锁策略。 1. 悲观锁&#xff0c;乐观锁&#xff08;描述的加锁时遇到的场景&#xff09; 悲观锁&#xff1a;预测接下来…...

【python】OpenCV—Hand Detection

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考6、其它手部检测和手势识别的方案 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 进行手部检测 2、代码实现 导入必要的库函数 import cv2 import media…...

es6的100个问题

基础概念 解释 let、const 和 var 的区别。什么是块级作用域&#xff1f;ES6 如何实现它&#xff1f;箭头函数和普通函数的主要区别是什么&#xff1f;解释模板字符串&#xff08;Template Literals&#xff09;的用途&#xff0c;并举例嵌套变量的写法。解构赋值的语法是什么…...

【Git 常用指令速查表】

Git 常用指令速查表 Git 常用指令速查表目录1. 初始化仓库2. 提交代码流程3. 分支管理4. 远程仓库操作5. 撤销操作6. 查看状态与日志7. 其他实用指令完整操作示例常用场景速查表 Git 常用指令速查表 目录 初始化仓库提交代码流程分支管理远程仓库操作撤销操作查看状态与日志其…...

Flink中聚合算子介绍

前言 在flink api中&#xff0c;聚合算子是非常常用的。所谓的聚合就是在分组的基础上做比较计算的操作。下面通过几个简单案例来说明聚合算子的用法和注意事项。 聚合算子案例 因为flink的api操作流程比较固定&#xff0c;从获取执行环境》获取数据源》执行数据转换操作》输…...

【基础】Windows 中通过 VSCode 使用 GCC 编译调试 C++

准备 安装 VSCode 及 C 插件。通过 MSYS2 安装 MinGW-w64 工具链&#xff0c;为您提供必要的工具来编译代码、调试代码并配置它以使用IntelliSense。参考&#xff1a;Windows 中的 Linux 开发工具链 验证安装&#xff1a; gcc --version g --version gdb --version三个核心配…...

Web Services 简介

Web Services 简介 概述 Web Services 是一种网络服务技术,允许不同的应用程序通过互联网进行交互和数据交换。随着互联网的普及和发展,Web Services 已经成为企业级应用中不可或缺的一部分。本文将详细介绍 Web Services 的概念、特点、应用场景以及相关的技术架构。 什么…...

数据仓库 - 转转 - 一面凉经

面试流程 自我介绍 Python 中&#xff0c;如何在数据清洗过程中应对内存不够的情况 如何避免&#xff0c;在使用Pandas处理大规模数据时&#xff0c;经常会遇到“SettingWithCopyWarning”警告 在Hive中&#xff0c;当您使用动态分区功能进行数据插入时&#xff0c;可能会遇…...

2025跳槽学习计划

&#xff08;1&#xff09;编程基础&#xff1a; 目录学习资料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv数据结…...

算法 | 2024最新算法:鳑鲏鱼优化算法原理,公式,应用,算法改进研究综述,matlab代码

2024最新鳑鲏鱼优化算法(BFO)研究综述 鳑鲏鱼优化算法(Bitterling Fish Optimization, BFO)是2024年提出的一种新型群智能优化算法,受鳑鲏鱼独特的繁殖行为启发,通过模拟其交配、产卵和竞争机制进行全局优化。该算法在多个领域展现出优越性能,尤其在解决复杂非线性问题中…...

具身系列——Diffusion Policy算法实现CartPole游戏

代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型&#xff08;Diffusion Model&#xff09;的强化学习策略网络。扩散模型通过逐步去噪过程生成动作&#xff0c;核心思想是&#xff1a; • 前向过程&#xff1a;通过T步逐渐将专家动作添加高斯噪声&#xff0c;最终变成…...

前端性能优化:深入解析哈希算法与TypeScript实践

/ 示例&#xff1a;开放寻址哈希表核心实现 class OpenAddressingHashTable<T> {private size: number;private keys: (string | null)[];private values: (T | null)[];private tombstone Symbol(Deleted);constructor(size: number 53) {this.size size;this.keys …...

知识就是力量——物联网应用技术

基础知识篇 一、常用电子元器件1——USB Type C 接口引脚详解特点接口定义作用主从设备关于6P引脚的简介 2——常用通信芯片CH343P概述特点引脚定义 CH340概述特点封装 3——蜂鸣器概述类型驱动电路原文链接 二、常用封装介绍贴片电阻电容封装介绍封装尺寸与功率关系&#xff1…...

(windows)conda虚拟环境下open-webui安装与启动

一、创建conda环境 重点强调下&#xff0c;如果用python pip安装&#xff0c;一定要选择python3.11系列版本&#xff0c;我选的3.11.9。 如果你的版本不是这个系列&#xff0c;将会出现一些未知的问题。 conda create -n open-webui python3.11 -y如下就创建好了 二、安装o…...

oracle密码过期 ORA-28001解决方案: the password has expired

** oracle密码过期 ORA-28001解决方案: the password has expired ** oracle 11g 默认密码过期时间为180天密码过期后&#xff0c;访问数据库会出现如下异常java.sql.SQLException: ORA-28001: the password has expired 查询密码过期设定 select * from dba profiles where…...

GStreamer —— 3.1、Qt+GStreamer制作多功能播放器,支持本地mp4文件、rtsp流、usb摄像头等(可跨平台,附源码)

🔔 GStreamer 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 运行效果...

六十天Linux从0到项目搭建(第十天)(系统调用 vs 库函数/进程管理的建模/为什么进程管理中需要PCB?/exec 函数/fork原理与行为详解)

1 系统调用 vs 库函数&#xff1a;本质区别与协作关系 核心区别 特性系统调用&#xff08;System Call&#xff09;库函数&#xff08;Library Function&#xff09;定义操作系统内核提供的 底层接口&#xff0c;直接操作硬件。封装系统调用的 高级函数&#xff0c;提供便捷功…...

资本运营:基于Python实现的资本运作模拟

基于Python实现的一个简单的资本运营框架&#xff1b; ​企业生命周期演示&#xff1a;观察初创→成长→上市→并购全流程 ​行业对比分析&#xff1a;不同行业的财务特征和估值差异 ​资本运作策略&#xff1a;体验IPO定价、投资决策、并购整合等操作 ​市场动态观察&#xff…...

当EFISH-SBC-RK3576遇上区块链:物联网安全与可信数据网络‌

在工业物联网场景中&#xff0c;设备身份伪造与数据篡改是核心安全隐患。‌EFISH-SBC-RK3576‌ 通过 ‌硬件安全模块 区块链链上验证‌&#xff0c;实现设备身份可信锚定与数据全生命周期加密&#xff0c;安全性能提升10倍以上。 1. 安全架构&#xff1a;从芯片到链的端到端防…...

关于spark在yarn上运行时候内存的介绍

在YARN上运行Spark时&#xff0c;内存管理是性能调优的核心环节。以下是 Driver Memory、Executor Memory、堆内存&#xff08;Heap Memory&#xff09; 和 堆外内存&#xff08;Off-Heap Memory&#xff09; 的区别与配置方法&#xff0c;以及实际场景中的最佳实践&#xff1a…...

分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)

仅供自学回顾使用&#xff0c;请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁&#xff0c;在本人其他文章中也有涉及。 《JUC&#xff1a;三、两阶段终止模式、死锁的jconsole检测、乐观锁&#xff08;版本号机制CAS实现&#xff09;悲观锁》&#xff1a;https://blog.…...

【VSCode的安装与配置】

目录&#xff1a; 一&#xff1a;下载 VSCode二&#xff1a;安装 VSCode三&#xff1a;配置 VSCode 一&#xff1a;下载 VSCode 下载地址&#xff1a;https://code.visualstudio.com/download 下载完成之后&#xff0c;在对应的下载目录中可以看到安装程序。 二&#xff1a;安装…...