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

SSE协议

目录

  • SSE协议
    • 协议实现
    • 传输格式
      • data 字段
      • id 字段
      • event 字段
      • retry 字段
    • 前后端实现
    • 使用案例
      • FastAPI + SSE-STARLETTE 模拟大模型推理流
        • 🖥 代码:FastAPI + SSE-STARLETTE 模拟大模型推理流

SSE协议

在这里插入图片描述

SSE,全称是 Server-Sent Events,是一种 服务器主动推送消息 到浏览器(客户端)的一种通信协议,基于 HTTP 单向流。

简单理解就是:

  • 客户端发起一个普通的 HTTP 请求(通常是 GET)。

  • 服务器保持这个连接不断开,持续地、实时地往客户端推送数据(类似实时通知、消息推送)。

  • 客户端收到数据后可以及时处理显示。

主要特点

  • 单向通信:服务器 → 客户端(客户端不能主动通过这个连接回传数据,只能发起新请求)。

  • 基于文本格式,数据流以 text/event-stream 的 MIME 类型传输。

  • 轻量、简单,不需要像 WebSocket 那样升级协议。

  • 自动重连(浏览器原生支持,断了会自动重连)。

  • 有序(服务器推送的消息默认是顺序到达的)。

同为浏览器推送技术,相较于 WebSocket 而言,Server-Sent Events (简称SSE)更少被人知晓,具体实践也较少。

原因有两点:

  • WebSocket 比 SSE 更强大,Websocket 在客户端和服务器之间建立了双向的实时通信。而 SSE 只支持从服务器到客户端的单向实时通信。
  • WebSocket 在浏览器方面支持更广(详见下图),IE / Edge 几乎根本不支持 SSE。

然而,就第一点而言,与 WebSocket 相比,SSE 也有独特的优势。

  • SSE 的浏览器端实现内置断线重连和消息追踪的功能,WebSocket 也能实现,但是不在协议设计范围内,需要手动处理。
  • SSE 实现简单,完全复用现有的 HTTP 协议,而 WebSocket 是相对独立于 HTTP 的一套标准,跨平台实现较为复杂。

协议实现

SSE 协议很简单,本质上是一个客户端发起的 HTTP Get 请求,服务器在接到该请求后,返回 200 OK 状态,同时附带以下 Headers:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
  • SSE 的 MIME Type 规定为 text/event-stream
  • SSE 肯定不允许缓存
  • SSE 是一个一直打开的 TCP 连接,所以 Connection 为 Keep-Alive

传输格式

每一条消息长这样:

data: 这是推送的数据
id: 1234
event: message
retry: 10000
  • data: 是发送的内容(可以多行)
  • id: 是消息 ID(浏览器会记下来,用于断线续传)
  • event: 可以指定事件类型(配合前端 addEventListener 监听不同事件)

每条消息 以两个换行符(\n\n)结尾,标志一条消息结束。

data 字段

数据内容用data字段表示。

data:  message\n\n

如果数据很长,可以分成多行,最后一行用\n\n结尾,前面行都用\n结尾。

data: begin message\n
data: continue message\n\n

下面是一个发送 JSON 数据的例子。

data: {\n
data: "foo": "bar",\n
data: "baz", 555\n
data: }\n\n

id 字段

数据标识符用id字段表示,相当于每一条数据的编号。

id: msg1\n
data: message\n\n

浏览器用lastEventId属性读取这个值。一旦连接断线,浏览器会发送一个 HTTP 头,里面包含一个特殊的Last-Event-ID头信息,将这个值发送回来,用来帮助服务器端重建连接。因此,这个头信息可以被视为一种同步机制。

event 字段

event字段表示自定义的事件类型,默认是message事件。浏览器可以用addEventListener()监听该事件。

event: foo\n
data: a foo event\n\ndata: an unnamed event\n\nevent: bar\n
data: a bar event\n\n

上面的代码创造了三条信息。第一条的名字是foo,触发浏览器的foo事件;第二条未取名,表示默认类型,触发浏览器的message事件;第三条是bar,触发浏览器的bar事件。

  • 在 SSE 协议规范(WHATWG EventSource spec)里,event: 是一个合法的标准字段。
  • event: 后面的内容(事件名)是可以随便取的,你可以叫 updatenew-messageheartbeatanything-you-want
  • 客户端可以通过 addEventListener("事件名", handler) 来分别监听不同类型的事件。

也就是说,SSE协议只规定了格式,但没有限制你具体的 event 名字

服务器发送的数据:

event: user-message
data: {"user":"Alice","msg":"Hi there"}event: system-alert
data: {"level":"warning","message":"Server is hot"}event: heartbeat
data: ping

前端可以这样监听不同的事件:

const es = new EventSource("/stream");// 监听普通消息
es.addEventListener("user-message", e => {console.log("收到用户消息:", e.data);
});// 监听系统警告
es.addEventListener("system-alert", e => {console.warn("系统警告:", e.data);
});// 监听心跳
es.addEventListener("heartbeat", e => {console.log("心跳包:", e.data);
});// 监听默认事件(没有 event: 字段时)
es.onmessage = e => {console.log("默认消息:", e.data);
};
  • 如果服务器没有指定 event: xxx,那浏览器默认就是 message 事件(onmessage 触发)。
  • 如果有指定 event: xxx,就要用 addEventListener("xxx", handler) 来监听。
  • event: 字段必须在 data: 字段前面,否则它只对下一条消息生效。

retry 字段

服务器可以用retry字段,指定浏览器重新发起连接的时间间隔。

retry: 10000\n

两种情况会导致浏览器重新发起连接:一种是时间间隔到期,二是由于网络错误等原因,导致连接出错。

前后端实现

前端代码,使用浏览器原生提供的方法即可:

const url = '/xx/xxx'
// 1. 创建实例
var source = new EventSource(url)// 2. 事件监听
// 建立连接后,触发`open` 事件
source.addEventListener('open', (e) => {console.log('open', e)
})
// 收到消息,触发`message` 事件
source.addEventListener('message', (e) => {console.log('message', e)
})
// 发生错误,触发`error` 事件
source.addEventListener('error', (e) => {console.log('error', e)
})
// 自定义事件
source.addEventListener('eventName', (e) => {// ...
}, false)// 3. 关闭链接
source.close()

上面的url可以与当前网址同域,也可以跨域。跨域时,可以指定第二个参数,打开withCredentials属性,表示是否一起发送 Cookie。

var source = new EventSource(url, { withCredentials: true });

EventSource实例的readyState属性,表明连接的当前状态。该属性只读,可以取以下值。

0:相当于常量EventSource.CONNECTING,表示连接还未建立,或者断线正在重连。
1:相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。
2:相当于常量EventSource.CLOSED,表示连接已断,且不会重连。

后端相对简单:

package mainimport ("fmt""net/http""time"
)func sseHandler(w http.ResponseWriter, r *http.Request) {// 设置必要的 Headerw.Header().Set("Content-Type", "text/event-stream")w.Header().Set("Cache-Control", "no-cache")w.Header().Set("Connection", "keep-alive")w.Header().Set("Access-Control-Allow-Origin", "*") // 跨域支持(如果有需要)// 确保支持 Flushflusher, ok := w.(http.Flusher)if !ok {http.Error(w, "Streaming unsupported!", http.StatusInternalServerError)return}// 这里是你的推送逻辑:每秒发一条消息ticker := time.NewTicker(1 * time.Second)defer ticker.Stop()// 如果客户端断开,这里可以检测ctx := r.Context()for {select {case <-ctx.Done():fmt.Println("客户端断开连接")returncase t := <-ticker.C:// 注意!每条消息需要以两个换行符 \n\n 结尾fmt.Fprintf(w, "event: tick\n")fmt.Fprintf(w, "data: %s\n\n", t.Format(time.RFC3339))// 刷新到客户端flusher.Flush()}}
}func main() {http.HandleFunc("/sse", sseHandler)fmt.Println("SSE 服务启动在 http://localhost:8080/sse")http.ListenAndServe(":8080", nil)
}

对于go也有对应的三方包,

在这里插入图片描述
使用非常简单:

import "github.com/gin-contrib/sse"func httpHandler(w http.ResponseWriter, req *http.Request) {// data can be a primitive like a string, an integer or a floatsse.Encode(w, sse.Event{Event: "message",Data:  "some data\nmore data",})// also a complex type, like a map, a struct or a slicesse.Encode(w, sse.Event{Id:    "124",Event: "message",Data: map[string]interface{}{"user":    "manu","date":    time.Now().Unix(),"content": "hi!",},})
}

为什么选择 gin-contrib/sse

  1. 与 Gin 的无缝集成
    gin-contrib/sse 是 Gin 官方维护的中间件之一,专为与 Gin 框架协作而设计。它与 Gin 的上下文 (*gin.Context) 紧密结合,简化了 SSE 的实现过程。

  2. 简化的 API
    该库提供了 c.SSEvent(event string, data interface{}) 方法,允许开发者轻松发送事件数据,无需手动设置响应头或处理连接管理。

  3. 自动处理连接生命周期
    gin-contrib/sse 自动处理连接的打开和关闭,减少了开发者需要关注的细节。

  4. 支持事件 ID 和重连机制
    该库支持设置事件 ID 和重连时间,符合 SSE 的标准规范,增强了消息的可靠性和客户端的容错能力。

  5. 广泛的社区支持
    作为 Gin 官方提供的中间件之一,gin-contrib/sse 拥有广泛的社区支持和文档资源,易于学习和使用。

以下是使用 gin-contrib/sse 实现 SSE 的示例:

package mainimport ("github.com/gin-gonic/gin""github.com/gin-contrib/sse"
)func main() {r := gin.Default()r.GET("/events", func(c *gin.Context) {c.Stream(func(w io.Writer) bool {sse.Encode(w, sse.Event{Event: "message",Data:  "Hello, SSE!",})return true})})r.Run(":8080")
}

与原生 Go SSE 的对比

特性原生 Go SSE 实现gin-contrib/sse
与框架集成需要手动设置响应头和连接管理与 Gin 无缝集成,简化实现
API 简洁性需要手动编码事件格式提供 c.SSEvent 等简洁方法
连接生命周期管理需要手动管理连接的打开和关闭自动处理连接的打开和关闭
事件 ID 和重连需要手动实现内置支持事件 ID 和重连机制
社区支持取决于使用的库作为 Gin 官方中间件,拥有广泛的社区支持

使用案例

FastAPI + SSE-STARLETTE 模拟大模型推理流

在使用 ChatGPT 时,发现输入 prompt 后,页面是逐步给出回复的,起初以为使用了 WebSckets 持久化连接协议,查看其网络请求,发现这个接口的通信方式并非传统的 http 接口或者 WebSockets,而是基于 EventStream 的事件流,像打字机一样,一段一段的返回答案。

ChatGPT 是一个基于深度学习的大型语言模型,处理自然语言需要大量的计算资源和时间,响应速度肯定比普通的读数据库要慢的多,普通 http 接口等待时间过长,显然并不合适。对于这种单项对话场景,ChagtGPT 将先计算出的数据“推送”给用户,边计算边返回,避免用户因为等待时间过长关闭页面。而这,可以采用 SSE 技术。

在这里插入图片描述

而现在很多大模型 API 服务(像 OpenAI 的 ChatGPT-API、各种 LLMs 推理服务)基本上都是:

  • 后端 Python
  • 框架FastAPI(因为支持 ASGI,可以异步高效处理流式返回)
  • 返回SSE流
from fastapi import FastAPI, Request
from fastapi.responses import StreamingResponse
import asyncio
import datetimeapp = FastAPI()async def event_generator():while True:# 等待1秒await asyncio.sleep(1)# 当前时间now = datetime.datetime.now().isoformat()# 注意SSE格式要求两个 \n\n 结尾yield f"event: tick\ndata: {now}\n\n"@app.get("/sse")
async def sse_endpoint(request: Request):# 检测客户端断开连接async def server_sent_events():async for event in event_generator():if await request.is_disconnected():print("客户端断开连接")breakyield eventreturn StreamingResponse(server_sent_events(),media_type="text/event-stream")

Python 生态里还提供了专门的 SSE 辅助库,最有名的是:

库名说明
sse-starlette基于 Starlette(FastAPI的底层框架),专门为 FastAPI/FastASGI 写的 SSE 工具。
flask-sse专门给 Flask 用户用的,封装了 Redis PubSub,适合广播场景。
python-sse一个小型独立库,纯粹处理 SSE 协议格式,不依赖具体 Web 框架。

🔥 举个 sse-starlette 用法示范(适合 FastAPI)

首先安装:

pip install sse-starlette

然后代码很简单:

from fastapi import FastAPI
from sse_starlette.sse import EventSourceResponse
import asyncio
import datetimeapp = FastAPI()async def event_publisher():while True:await asyncio.sleep(1)yield {"event": "tick","data": datetime.datetime.now().isoformat()}@app.get("/sse")
async def sse():return EventSourceResponse(event_publisher())

🔥 这个库帮你自动做了什么?

功能原本要手动做的事
帮你正确格式化 event:data:\n\n你自己就不用手动 yield f"event: xx\ndata: yy\n\n"
自动设置 Content-Type: text/event-stream
支持 request.is_disconnected() 检测防止死循环
支持传 retry: 字段(控制断线重连时间)
支持 id: 字段(让前端从上次断开位置继续接收)

基本就是 开箱即用,专门为 SSE 而生,而且和 FastAPI 非常搭配。✨

🖥 代码:FastAPI + SSE-STARLETTE 模拟大模型推理流
from fastapi import FastAPI
from sse_starlette.sse import EventSourceResponse
import asyncio
import randomapp = FastAPI()# 模拟的 LLM 推理,每次产出一个 "token"
async def fake_llm_stream(prompt: str):fake_tokens = ["Hello", ",", " this", " is", " a", " simulated", " response", ".", " Thank", " you", " for", " using", " our", " AI", " model", "!"]for token in fake_tokens:# 每隔随机 100~400ms 推一个 tokenawait asyncio.sleep(random.uniform(0.1, 0.4))yield {"event": "token",              # 自定义事件名:token"data": token}# 推送一个结束标志(可以不推)yield {"event": "end","data": "[DONE]"}@app.get("/chat/stream")
async def chat_stream(prompt: str):# 每次访问 /chat/stream?prompt=xxx,就返回一个 Streaming Responsereturn EventSourceResponse(fake_llm_stream(prompt))

🛠 前端测试 HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>LLM Stream Demo</title>
</head>
<body><h1>LLM 流式输出 Demo</h1><div id="output" style="white-space: pre-wrap; font-family: monospace;"></div><script>const prompt = "你好,请介绍一下自己";const es = new EventSource(`http://localhost:8000/chat/stream?prompt=${encodeURIComponent(prompt)}`);es.addEventListener("token", (e) => {document.getElementById("output").textContent += e.data;});es.addEventListener("end", (e) => {console.log("流式输出结束:", e.data);es.close();});es.onerror = (e) => {console.error("连接出错", e);es.close();};</script>
</body>
</html>

🔥 效果

  • 你一打开页面,它就调用 /chat/stream
  • 后端像大模型那样一块块流式返回 Token。
  • 浏览器前端实时接收、一字字拼出来
  • 最后收到 event: end,自动关闭连接。

就跟你用 OpenAI ChatCompletion stream=True 一模一样的体验!🎯

📦 依赖安装

别忘了装必要依赖哦:

pip install fastapi sse-starlette uvicorn

然后运行:

uvicorn your_file_name:app --reload

(记得把 your_file_name 换成你保存的 Python 文件名)

相关文章:

SSE协议

目录 SSE协议协议实现传输格式data 字段id 字段event 字段retry 字段 前后端实现使用案例FastAPI SSE-STARLETTE 模拟大模型推理流&#x1f5a5; 代码&#xff1a;FastAPI SSE-STARLETTE 模拟大模型推理流 SSE协议 SSE&#xff0c;全称是 Server-Sent Events&#xff0c;是一…...

精益数据分析(25/126):关键指标驱动业务发展

精益数据分析&#xff08;25/126&#xff09;&#xff1a;关键指标驱动业务发展 在创业和数据分析的道路上&#xff0c;我们都在不断探索如何利用数据实现业务的增长与优化。今天&#xff0c;让我们一起深入学习《精益数据分析》中的关键知识点&#xff0c;通过实际案例来理解…...

基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API

前言 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。 项目地址 gitcode平台&#xff1a;ht…...

git 工具

Git教程 Git Bash详细教程 Git教程 Git Bash详细教程-CSDN博客 Download – TortoiseGit – Windows Shell Interface to Git...

利用【指针引用】对【非空单循环链表】进行删除操作

【非空单循环链表】是链式存储结构的其中一种&#xff0c;下面是各个词汇的意思&#xff1a; 先说【单】的意思&#xff1a; 这里指的是【单循环】的&#xff0c;另外在别的地方你会碰到一些不一样的循环链表&#xff0c;比如说是【多重链】的。 单循环 【单循环链表】常在表的…...

2025.4.26_STM32_SPI

1.SPI简介 2.硬件电路 所有SPI设备的SCK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)分别连在一起。SCK线只能被主机控制&#xff0c;和I2C相同。 主机另外引出多条SS控制线&#xff0c;分别接到各从机的SS引脚 (SS不用的时候为高电平&#xff0c;当主机需要选中某…...

基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记

基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记 基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记系统架构全景 一、实物演示二、OpenMV端设计要点1. 硬件配置优化2. 智能帧率控制算法3. 数据传输协议设计 三、PyTorch后端核心实现&#xff1a;YOLOv11与PaddleOCR的…...

当JIT遇见K8s

目录 一、技术融合背景&#xff1a;从静态架构到动态生态的范式重构 1.1 动态编译技术的三次进化浪潮 1.2 容器编排系统的动态特性解剖 弹性伸缩的数学建模 服务质量&#xff08;QoS&#xff09;的编译场景适配 硬件拓扑感知的编译优化 二、关键技术挑战与突破性解决方案…...

单片机-89C51部分:4、固件烧录

飞书文档https://x509p6c8to.feishu.cn/wiki/M00gwFX3WilLe0kiAmBcPBUsnLc 接线 通过USB线把开发板和电脑连接起来&#xff0c;如果电脑没有安装过USB转串口驱动&#xff0c;在设备管理器中就找不到COM口&#xff0c;而且会有驱动提示叹号&#xff0c;我们可以下载下方驱动安…...

7.13 GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍!

GitHub Sentinel全链路测试实战:自动化框架+零误差传输,QPS提升6倍 GitHub Sentinel Agent 用户界面设计与实现 关键词:前后端联调测试、数据传输验证、接口稳定性测试、命令行工具测试、自动化测试框架 测试前后端功能与数据传输稳定性 1. 全链路测试策略设计 采用分层…...

stm32之EXIT外部中断详解

目录 1.引入: STM32F1031.1 中断路径上的3个部件1.2 STM32F103的GPIO中断1.1.1 GPIO控制器 -- AFIO1.1.2 EXTI1.1.3 NVIC1.1.4 CPU1. PRIMASK2. FAULTMASK3. BASEPRI 1.3 中断执行流程 2.旋转编码器介绍3.实验3.1 EXIT3.1.1 结构体3.1.2 函数 3.2 NVIC3.2.1 结构体3.2.2 函数 3…...

STM32 开发 - stm32f10x.h 头文件(内存映射、寄存器结构体与宏、寄存器位定义、实现点灯案例)

概述 STM32F10x.h 是 STM32F1 系列微控制器的核心头文件&#xff0c;提供了所有外设寄存器的定义和内存映射 一、内存映射 #define PERIPH_BASE ((uint32_t)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE 0x…...

UniApp 的现状与 WASM 支持的迫切性

一、UniApp 的跨平台优势与性能瓶颈 UniApp 凭借“一次开发&#xff0c;多端发布”的核心理念&#xff0c;已成为跨平台开发的主流框架之一。然而&#xff0c;随着移动应用场景的复杂化&#xff08;如 3D 渲染、音视频处理、AI 推理&#xff09;&#xff0c;传统的 JavaScript…...

Prometheus、Zabbix和Nagios针对100个节点的部署设计架构图

一、Prometheus 架构图(联邦集群+分布式存储) graph TD;subgraph 全局监控层GlobalProm[Prometheus Server] -->|联邦查询| RegionalProm1[区域Prometheus]GlobalProm -->|联邦查询| RegionalProm2[区域Prometheus]GlobalProm -->|联邦查询| RegionalProm3[区域Pro…...

坚果派已适配的鸿蒙版flutter库【持续更新】

坚果派已适配的鸿蒙版flutter库 序号原仓版本适配仓文章解读是否完成1https://pub.dev/packages/fluttertoast8.2.12https://gitcode.com/nutpi/FlutterToasthttps://www.nutpi.net/thread?topicId1575是2https://pub.dev/packages/flutter_udid4.0.0https://gitcode.com/nut…...

代码随想录打卡|Day28 动态规划(理论基础、斐波那契数列、爬楼梯、使用最小花费爬楼梯)

动态规划 Part01 理论基础 代码随想录讲解链接 视频讲解链接 斐波那契数 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一…...

《USB技术应用与开发》第四讲:实现USB鼠标

一、标准鼠标分析 1.1简介 1.2页面显示 其中页面显示的“”不用管它&#xff0c;因为鼠标作为物理抓包&#xff0c;里面有时候会抓到一些错误&#xff0c;不一定是真正的通讯错误&#xff0c;很可能是本身线路接触质量不好等原因才打印出来的“”。 1.3按下鼠标左键 &#x…...

elk中kibana一直处于可用和降级之间且es群集状态并没有问题的解决方法

前言 在公司部elk的时候发现kibana的web界面一直很卡&#xff0c;数据量为0也会很卡&#xff0c;es群集状态正常&#xff0c;资源足够。 报错信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…...

2025.4.26总结

今天把马良老师的《职场十二法则》看完后&#xff0c;感触极大&#xff0c;这们课程就是一场职场启蒙课。 虽然看过不少关于职场的书籍&#xff0c;但大多数是关于职场进阶&#xff0c;方法方面的。并没有解答“面对未来二三十年的职场生涯&#xff0c;我该怎么去看待自己的工…...

一、UI自动化测试01--认识和元素定位方法

目录 一、自动化测试1. 自动化应用场景2. ⾃动化测试的优缺点3. ⾃动化测试的分类 二、UI ⾃动测试1. 适合使用的项目2. 实现时机3. 常⻅的UI⾃动化测试⼯具4. Selenium 框架5. Web ⾃动化环境部署6. Web ⾃动化基本代码 二、元素定位1. 浏览器开发者⼯具⽅法1: 直接获取信息⽅…...

目标检测原理简介

目标检测是一类计算机视觉任务,简单来说,目标检测可被定义为在计算机中输入一张图像,计算机需要找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,如图一所示。目标检测是计算机视觉领域的核心问题之一,相较于最原始的将整张图片分类为某一类别,目标检测不光可…...

软件设计原则

开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。 想要达到这样的效果&#xff0c;需要使用接口和抽象类。 因…...

Postman脚本处理各种数据的变量

一、变量是字符串里列表&#xff0c; 如 "["100","101","102","103","108"]" //把字符串的变量处理成列表 var myListJSON.parse(pm.environment.get(giftTabId)) #giftTabId变量名 //设置随机取值 var rando…...

嵌入式硬件开发工具---万用表---示波器---仿真器

万用表 主要功能&#xff1a; 测量交直流电压、电流 测量电阻、二级管及电路通断 其他----电容、频率、温度----特殊的万用表 * 检查电路是否正常 * 检查电路连接情况 示波器 主要功能&#xff1a; 以波形展示电信号随时间变化的关系 主要指标&#xff1a; 带宽---大…...

数据预处理之特征选择 (Feature Selection)

哈喽&#xff0c;大家好&#xff0c;我是我不是小upper~ 今天的文章和大家来聊聊数据与处理方法中常用的特征选择 在开始说特征选择前&#xff0c;咱们先搞清楚这个所谓的“特征”到底是啥玩意儿。 打个比方说&#xff0c;如果我们要训练一个模型来判断某个人是否会买一双运…...

Java基础 — 循环

介绍 Java基础循环是程序流程控制的核心结构&#xff0c;主要用于重复执行特定代码块。常见的循环包括for、while和do-while三种形式&#xff0c;开发者可根据不同场景灵活选择。 合理使用循环关键字能有效提升代码执行效率。掌握循环结构的核心在于理解执行流程与条件判断的时…...

参考平面的宽度-信号与电源完整性分析

参考平面的宽度: 计算特征阻抗时假设参考平面是无限宽的平面。在参考平面的宽度远大于线宽或介质厚度时&#xff0c;这种假设是正确的。但是PCB板上的参考平面经常被反焊盘掏空&#xff0c;当互连线经过参考平面掏空区域附近时&#xff0c;掏空的局部互连线参考平面变窄&#x…...

【Linux】Centos7 安装 Docker 详细教程

一、安装步骤 步骤一&#xff1a;确定你是Centos7及以上的版本 cat /etc/redhat-release 步骤二&#xff1a;卸载旧版本 查看官方文档&#xff1a;CentOS | Docker Docs 步骤三&#xff1a;安装GCC等工具 1.首先确保 CentOS7 能上外网 ping www.baidu.com 2.更新 Centos7…...

开源AI智能名片链动2+1模式S2B2C商城小程序源码赋能下的社交电商创业者技能跃迁与价值重构

摘要&#xff1a;在移动互联网深度重构商业生态的背景下&#xff0c;社交电商创业者面临流量成本攀升、用户粘性不足、供应链协同低效等核心痛点。本文以“开源AI智能名片链动21模式S2B2C商城小程序源码”技术体系为研究对象&#xff0c;通过分析其技术架构、商业逻辑及实战案例…...

计算机视觉与深度学习 | LSTM原理及与卡尔曼滤波的融合

长短期记忆网络(LSTM)是一种特殊的循环神经网络(RNN),旨在解决传统RNN在处理长序列数据时出现的梯度消失和梯度爆炸问题。以下为你详细介绍其基本原理: 核心思想:LSTM的核心思想是引入记忆单元和门控机制来控制信息的流动,从而解决传统RNN的梯度消失问题。记忆单元类似…...

阿里云域名智能解析至国内外AWS的合规化部署指南

引言 随着全球化业务的发展,企业常面临地域合规性与用户体验优化的双重挑战。本文以阿里云域名解析为核心,结合AWS中国区(北京/宁夏)与Global区域部署,提供一套完整的解决方案,实现: 智能流量调度:国内用户访问AWS中国区,海外用户自动路由至AWS Global全链路合规:满…...

一、鸿蒙编译篇

一、下载源码和编译 https://blog.csdn.net/xusiwei1236/article/details/142675221 https://blog.csdn.net/xiaolizibie/article/details/146375750 https://forums.openharmony.cn/forum.php?modviewthread&tid897 repo init -u https://gitee.com/openharmony/mani…...

计算机网络 | 应用层(3)-- 因特网中的电子邮件

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记 关注我&#x1f339;&#xff0c;和我一起学习更多计算机的知识 &#x1f51d;&#x1f51d;&#x1f51d; 目录 3. 因特网中的电子邮件 …...

Missashe考研日记-day27

Missashe考研日记-day27 0 写在前面 博主昨晚有事所以没学专业课&#xff0c;白天学了其他科&#xff0c;但是觉得不太好写博客&#xff0c;就合在今天一起写好了。 1 专业课408 学习时间&#xff1a;3h30min学习内容&#xff1a; 今天把内存管理部分剩下的关于分页分段和段…...

【Castle-X机器人】五、物联网模块配置与调试

持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】五、物联网模块配置与调试 五、物联网模块配置与调试5.1 物联网模块调试物联网模块测试:控制物联网模块:物联网模块话题五、物联网模块配置与调试 5.1 物联网模块调试 调试前需确保Castle-x与mqtt主机服务器处于同…...

FastAPI 零基础入门指南:10 分钟搭建高性能 API

一、为什么选择 FastAPI&#xff1f; 想象一下&#xff0c;用 Python 写 API 可以像搭积木一样简单&#xff0c;同时还能拥有媲美 Go 语言的性能&#xff0c;这个框架凭借三大核心优势迅速风靡全球&#xff1a; 开发效率提升 3 倍&#xff1a;类型注解 自动文档&#xff0c;…...

有关图的类型的题目(1)

1、图着色问题 #include<bits/stdc.h> using namespace std; const int N510,MN*N; int color[N]; vector<int> g[M]; int v,m,k,n;void add(int a,int b){g[a].push_back(b);g[b].push_back(a); } int judge(int cnt){if(cnt!k)return 0;for(int i1;i<v;i){fo…...

threejs 零基础学习day01

一、threejs本地环境搭建 1、下载源码 &#xff08;1&#xff09;进入threejs官网&#xff0c;把源码下载到本地访问。https://github.com/mrdoob/three.js &#xff08;2&#xff09;使用git命令的方式进行下载&#xff08;优点是&#xff0c;threejs更新频繁&#xff0c;这…...

dubbo 异步化实践

DubboService public class AsyncOrderFacadeImpl implements AsyncOrderFacade {private Logger logger LoggerFactory.getLogger(AsyncOrderFacadeImpl.class);// 构建线程池ThreadPoolExecutor threadPoolExecutor new ThreadPoolExecutor(1000, 1000, 10, TimeUnit.SECOND…...

Web端ER可视化

背景介绍 因业务需要,团队决定对原ER图功能进行重构。重构来自两方面,一是功能上进行了细分,二是实现方式发生了变化。下面是重构前后对比: 重构前重构后功能方面只有逻辑模型层面的ER图包括概念模型、逻辑模型、物理模型3个层面的ER图实现方式单页面、antv/g6微前端、Rea…...

Java在云计算、大数据、云原生下的应用和优势 - 面试实战

Java在云计算、大数据、云原生下的应用和优势 - 面试实战 第一轮提问 面试官&#xff1a;马架构&#xff0c;请简单介绍一下Java在云计算中的主要应用场景有哪些&#xff1f; 马架构&#xff1a;Java在云计算中的主要应用场景包括微服务架构设计、容器化部署&#xff08;如D…...

精益数据分析(27/126):剖析用户价值与商业模式拼图

精益数据分析&#xff08;27/126&#xff09;&#xff1a;剖析用户价值与商业模式拼图 在创业和数据分析的领域中&#xff0c;每一次深入学习都是一次成长的契机。今天&#xff0c;我们继续秉持共同进步的理念&#xff0c;深入研读《精益数据分析》&#xff0c;剖析用户价值的…...

从 Lambda 到 DSL:Kotlin 接口实现的演进之路

Kotlin 中优化 Android 接口实现的几种方式 在 Android 开发中&#xff0c;Kotlin 提供了多种优雅的方式来优化接口实现。以下是几种优化方案&#xff1a; 1. 使用 SAM 转换简化单方法接口 对于单一抽象方法(Single Abstract Method, SAM)接口&#xff1a; // 优化前 butto…...

GitOps进化:深入探讨 Argo CD 及其对持续部署的影响

什么是 GitOps&#xff1f; 虽然软件开发生命周期的大部分已经实现自动化&#xff0c;但基础设施仍然在很大程度上依赖于人工&#xff0c;需要专业团队的参与。随着当今基础设施需求的不断增长&#xff0c;实施基础设施自动化变得越来越重要。现代基础设施需要具备弹性&#x…...

有源晶振与无源晶振详解:区别、应用与选型指南

一、基本定义 无源晶振&#xff08;Crystal&#xff0c;晶体谐振器&#xff09; 结构&#xff1a;仅包含石英晶体&#xff0c;无内置振荡电路。 工作原理&#xff1a;依赖外部电路&#xff08;如MCU的振荡器&#xff09;驱动&#xff0c;通过机械振动产生谐振频率。 核心公式…...

机器学习:逻辑回归实现二元分类

本例子以鸡蛋受精卵为例,假设未受精的鸡蛋在某个区域聚集,受精的在另一个区域。比如,用正态分布生成两个类别的数据,均值不同,方差相同或不同。例如,未受精的鸡蛋的特征均值为[1,1],受精的为[4,4],这样两类数据点可以在二维空间中被分开。 首先,生成数据。使用sklear…...

Android学习总结之kotlin篇(一)

1. open 关键字的用法和作用深入源码分析 类的 open 修饰&#xff1a;在 Kotlin 字节码层面&#xff0c;对于一个open类&#xff0c;编译器会在生成的字节码中添加ACC_SUPER和ACC_OPEN标志。例如&#xff0c;定义一个open class TestOpenClass&#xff0c;反编译其字节码可以看…...

arcgis空间分析理论研究

arcgis的空间分析功能有&#xff08;1&#xff09;地形与地表分析&#xff1b;&#xff08;2&#xff09;距离与成本分析&#xff1b;&#xff08;3&#xff09;密度分析&#xff1b;&#xff08;4&#xff09;水文分析&#xff1b;&#xff08;5&#xff09;统计分析&#xff…...

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬到楼顶。…...

Eigen核心矩阵/向量类 (Matrix, Vector, Array)

1. Matrix 类&#xff08;稠密矩阵&#xff09; 模板参数 cpp Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> Scalar: 元素类型&#xff08;如 float, double, int&#xff09;。 Rows/Cols: 行数和列数&#xff08;Dynamic 表示动态大小&#xff09;。 O…...