惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

Mox的笔记库

细嗦下MLIR的环境搭建 | Mox的笔记库 博客重构:从Hexo到Astro | Mox的笔记库 2026PPoPP MLIR Tutorial学习 | Mox的笔记库 MacOS配置《明日方舟:终末地》 | Mox的笔记库 2025:向内生长 | Mox的笔记库 由mlir::ExecutionEngine引发的跨系统问题 | Mox的笔记库 WSL2配置Cuda-Tile环境记录(未完待续) | Mox的笔记库 Vibe Coding手搓项目记录 | Mox的笔记库 给Debian上包——以DuckDB为例 | Mox的笔记库 UCPD.sys事件存档 | Mox的笔记库 换新电脑之Mac mini M4从购买到配置 | Mox的笔记库 Mac配置MLX-C开发环境 | Mox的笔记库 RISC-V meets RDBMS——RISC-V架构上可运行数据库一览 | Mox的笔记库 DuckDB Sort实现调查 | Mox的笔记库 修复Redis在树莓派5上无法运行的问题 | Mox的笔记库 如何在MLIR中自定义类型并且输出运行 | Mox的笔记库 网站网络结构变更记录 | Mox的笔记库 EDBT25论文阅读:PhoebeDB——A Disk-Based RDBMS Kernel for High-Performance and Cost-Effective OLTP SIGMOD25论文阅读:BPF-DB:——A Kernel-Embedded Transactional Database Management System For eBPF Applications SIGMOD24文章阅读:Query Compilation Without Regrets | Mox的笔记库 论文阅读:Designing an Open Framework for Query Optimization and Compilation Apache Arrow Gandiva项目解析 | Mox的笔记库 VLDB24论文阅读:Cloud-Native Database Systems and Unikernels——Reimagining OS Abstractions for Modern Hardware NoisePage源码分析(未完待续) | Mox的笔记库 VLDB20论文阅读:Mainlining Databases——Supporting Fast Transactional Workloads on Universal Columnar Data File Formats VLDB17论文阅读:Relaxed Operator Fusion for In-Memory Databases:Making Compilation, Vectorization, and Prefetching Work Together At Last 论文阅读:How not to structure your database-backed web applications——a study of performance bugs in the wild SIGMOD24阅读:ROME——Robust Query Optimization via Parallel Multi-Plan Execution 文章阅读:First Past the Post-Evaluating Query Optimization in MongoDB SIGMOD文章阅读:Apache Calcite——A Foundational Framework for Optimized Query Processing Over Heterogeneous Data Sources VLDB23论文阅读:Analyzing the Impact of Cardinality Estimation on Execution Plans in Microsoft SQL Server SIGMOD22论文阅读:Efficient Massively Parallel Join Optimization for Large Queries VLDB论文阅读:Weaving Relations for Cache Performance VLDB22论文阅读:ConnectorX——Accelerating Data Loading From Databases to Dataframes 论文阅读:UniKraft-Fast, Specialized Unikernels the Easy Way 当DuckDB遇上RISC-V | Mox的笔记库 SIGMOD25论文阅读:An Elephant Under The Microscope——Analyzing The Interaction Of Optimizer Components In PostgreSQL 论文阅读:Compile-Time Analysis of Compiler Frameworks for Query Compilation VLDB23阅读:Bringing Compiling Databases to RISC Architectures LingoDB源码编译与分析 | Mox的笔记库 淦!MLIR输出Hello World不应该这么难! | Mox的笔记库 如何愉快的运行一个MLIR程序 | Mox的笔记库 2024:拥挤年代的想象与创造 | Mox的笔记库 如何给自己的博客添加MLIR和LLVM IR语法高亮 | Mox的笔记库 VLDB19-Parsing Gigabytes of JSON per Second论文阅读 CIDR25:Runtime-Extensible Parsers阅读 | Mox的笔记库 MLIR学习资料整理 | Mox的笔记库 SIGMOD24文章阅读:VeriTxn | Mox的笔记库 VLDB23文章阅读——Exploiting Cloud Object Storage for High-Performance Analytics VLDB24——OLAP on Modern Chiplet-Based Processors走马观花阅读 VLDB22:YeSQL文章阅读(已废弃) | Mox的笔记库 如何让数据库中的Python跑的更快-VLDB22-YeSQL文章阅读 | Mox的笔记库 你好,世界! | Mox的笔记库 让系统研究更有意义:HarmonyOS NEXT的教训和经验——讲座回顾 | Mox的笔记库 UNSW 24T3 COMP9336上课记录 | Mox的笔记库 Velox开发环境配置踩坑记录 | Mox的笔记库 MLIR Toy Tutorial实践记录 | Mox的笔记库 论文阅读:Declarative Sub-Operators for Universal Data Processing LLVM-Kaleidoscope实操踩坑记录 | Mox的笔记库 2024年7月RSSHub开发体验 | Mox的笔记库 澳洲大学计算机硕士比较 | Mox的笔记库 论文阅读——CDUL:CLIP-Driven Unsupervised Learning for Multi-Label Image Classification 论批量快速添加图片与视频水印的事 | Mox的笔记库 CVPR2023-CLIP算法调研 | Mox的笔记库 基于元信息写入的服务器压力测试 | Mox的笔记库 MjAyMw==,希望,前进与平庸之道 | Mox的笔记库 家庭组网IPv6+Mesh折腾 | Mox的笔记库 code-server初体验 | Mox的笔记库 从Nginx到Caddy | Mox的笔记库 Hexo部署安装全流程回顾 | Mox的笔记库 RMM观察与初探 | Mox的笔记库 计算机网络课设——UDP/TCP/TLS Socket实验 | Mox的笔记库 JQuery的XSS初探 | Mox的笔记库 生产实习记录 | Mox的笔记库 Fedora-CoreOS配置与试用(2023年) | Mox的笔记库 Electron学习笔记 | Mox的笔记库 报告翻译:容器云的安全挑战 | Mox的笔记库 Arch Linux迁移计划 | Mox的笔记库 Vagrant配置Metarget靶场环境 | Mox的笔记库 OpenAI-whisper折腾 | Mox的笔记库 202202,困惑,混乱与未曾设想之路 | Mox的笔记库 2022年Hack the box:Tier1免费区全解 | Mox的笔记库 Navidrome部署记录 | Mox的笔记库 长安杯2021-snake复现 | Mox的笔记库 报告概要翻译:OBFUSCATING C++ PROGRAMS VIA CONTROL FLOW FLATTENING 从零开始的Django CVE-2022-28346复现 | Mox的笔记库 2022CISCN(西北区赛)-The shinning | Mox的笔记库 Docker+QEMU+Arm64(Ubuntu)+环境配置(2022版) | Mox的笔记库 Arch Linux运行树莓派系统(2022年) | Mox的笔记库 2022CISCN初赛-ez_usb-复盘WriteUp | Mox的笔记库 NodeMCU-MicroPython配置实录 | Mox的笔记库 Django事务使用 | Mox的笔记库 记录第一次EduSRC上报 | Mox的笔记库 Jetbrain问题应急处理 | Mox的笔记库 Celery5.2学习&配置 | Mox的笔记库 Waline部署记录 | Mox的笔记库 2021年12月 Vivo千镜杯回顾 | Mox的笔记库 Frida hook初次实战 | Mox的笔记库 Log4j2漏洞复现 | Mox的笔记库 Windows的WSL2+Docker初探 | Mox的笔记库
ServerSentEvent学习 | Mox的笔记库
2023-06-07 · via Mox的笔记库

起因

我记得我在高中时候问过老师:发送一次HTTP请求,能否收到多次HTTP请求回复。

老师的回答是:不能

直到我上了大学,2023年,不少ChatGPT聊天框的实现开始使用Server Sent Event(SSE)实现打字机样式的输出,我发现高中时的需求居然是可以实现的。在此之前,这一类需求我都是用WebSockets实现。Python的Flask和Django关于WebSockets属实让人不舒服,SpringBoot有关Websockets的配置也让我鼓弄了老半天(Java用的少是原罪)。但如果用SSE,回复只要按流式传输返回即可,个人感觉在理解上相对容易一些。

参考资料

MDN里面关于实现有很详细的说明

Using server-sent events

阮一峰的教程,一份很好的普及资料

Server-Sent Events 教程

学校挑战杯实践记录

在实践中发现:如果要从网页前端(通过摄像头录制视频)往后端传输视频,浏览器不提供视频压缩方案,且要么只能往后端通过流式传输每帧图片的Base64,要么就是通过Websockets传输每帧图片的Base64(本质上还是流式传输),这就让人很无语。

当时的应用场景是:后端处理前端发来的图片,对每张图片进行解析后发回解析的评价与解析过后的图片。我给出的解决方案是:视频/图片通过Websockets传输,图片解析通过SSE进行返回。

前端通过MediaRecorder API调用摄像头。mediaRecorder.start() 括号里面要填上间隔时间的,所以MDN的这个Example看着让人很迷惑(即Example直接运行是错误的)

pCFLoJ1.md.png

而后端的Python,则需要利用Python yield的特性进行数据返回。如果不熟悉Python async操作的话也很容易踩上坑。

Python 异步迭代器 解决TypeError: ‘async_generator‘ object is not iterable

在编写Python脚本对后端测试的时候,发现Python httpx的session居然无法复用,或者说复用后无法异步请求

浅度测评:requests、aiohttp、httpx 我应该用哪一个?

在Python中,有关Queue的nowait_开头的操作,在异步的情况下容易出错,但直接get和put就会直接锁死。难道Queue就没有加锁操作吗?

到了后面,项目要接入ChatGPT(图片的评价通过ChatGPT进行润色),于是也研究了一下ChatGPT的SSE返回。然而ChatGPT的SSE请求是通过POST请求开启的,而浏览器自带的EventSource API只支持GET请求。遇到这种情况就只能通过对Fetch API进行包装后进行实践。由于本人对JS/TS也只是个三脚猫的水准,外加项目急着答辩,自己写的封装死活写不对。最后用的是微软的封装@microsoft/fetch-event-source

在Fetch中使用SSE,支持POST

import { fetchEventSource } from '@microsoft/fetch-event-source';

对于OpenAI接口的实现样例

export function send1(){

fetchEventSource(GPT, {

method: 'POST',

headers: {

'Content-Type': 'application/json',

'Authorization': "Bearer",

},

body: JSON.stringify({

model: "gpt-3.5-turbo",

stream: true,

messages: [

{"role": "system", "content": "你是个阳光开朗大男孩"},

{"role": "user", "content": "你好" }

],

}),

onmessage(ev) {

try{

const result = JSON.parse(ev.data)

console.log(ev.data)

} catch (e) {

console.log('解析 JSON 数据时出错:', e);

}

}

});

}

Python Sanic框架有关SSE的Example

@app.route('/comment')

async def test(request):

response = await request.respond(content_type='text/event-stream;charset=utf-8')

await response.send("retry: 10000\n")

await response.send("event: connecttime\n")

await response.send("data: " + "hello" + "\n\n")

while True:

if not commentQueue.empty():

await response.send("data: " + commentQueue.get_nowait() + "\n\n")

await asyncio.sleep(1)

await response.eof()

在前端,要想把摄像头的stream拿出来,就必须async getMedia

async function getMedia() {

const constraints = {

video: {width: 1080, height: 720},

audio: false

};

stream = await navigator.mediaDevices.getUserMedia(constraints);

video.value.srcObject = stream;

video.value.play();

// await video.value.play();

}

getMedia()

结语

通过学校挑战杯的这个项目算是对SSE技术有一个相对全面的了解,虽然中间也干出了不少大力出奇迹的事情(这样的事情在项目经常发生),但在录制/答辩现场顺利的跑了起来,也不算白忙活。记录一下,方便日后回顾。