fasthttp 中如何使用`Transfer-Encoding: chunked` 方式的流式内容输出
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
具体的思路是这样:通过 RequestCtx 的 Conn() 方法,获得 tcp 套接字。然后直接在 tcp 套接字上 Write 流式内容就行。
上代码:
package main
import (
"bufio"
"bytes"
"fmt"
"io"
syslog "log"
"net"
"os"
"strconv"
"time"
"github.com/valyala/bytebufferpool"
"github.com/valyala/fasthttp"
)
func FasthttpHandler(ctx *fasthttp.RequestCtx) {
ctx.HijackSetNoResponse(true) // 不使用 fasthttp 框架的输出
ctx.Hijack(func(c net.Conn) { // 这里会 go 出来一个协程执行 hijack 回调函数
log.Println("do nothing")
})
//
buf := bytebufferpool.Get()
defer bytebufferpool.Put(buf)
buf.Reset()
buf.B = append(buf.B, "HTTP/1.1 200 OK\r\n"+
"Server: fasthttp\r\n"+
"Date: Thu, 26 Oct 2023 01:09:23 GMT\r\n"+
"Content-Type: text/plain\r\n"+
"Cache-Control: no-cache, no-store, must-revalidate\r\n"+
"Transfer-Encoding: chunked\r\n"+
"\r\n"...)
conn := ctx.Conn()
_, _ = conn.Write(buf.B) // 写 http 头
//
for i := 0; i < 9; i++ {
_, _ = conn.Write([]byte(fmt.Sprintf("%x\r\n%d \r\n", 1, i)))
time.Sleep(1 * time.Second)
}
// 写入结束信息
_, _ = conn.Write([]byte("0\r\n\r\n")
}
func main() {
syslog.SetFlags(syslog.Lshortfile | syslog.LstdFlags)
server := &fasthttp.Server{
Handler: FasthttpHandler,
}
syslog.Fatalln(server.ListenAndServe(":8089"))
}
通过上述的方式虽然可以实现流式输出,但实际测试发现性能很差。
性能差的原因是每次请求都会 go 出来协程去执行 hijack 函数。
为此我改了一个版本,只要不设置 hijack 函数就不会产生协程去调用:
在 go.mod 中加上这样一句:
replace (
github.com/valyala/fasthttp => github.com/ahfuzhang/compress v1.49.2
)
然后注释掉设置 hijack 的那几行:
ctx.HijackSetNoResponse(true)
//ctx.Hijack(func(c net.Conn) {
// log.Println("do nothing")
//})
希望对大家有用,have fun
fasthttp 中如何使用`Transfer-Encoding: chunked` 方式的流式内容输出的更多相关文章
- HTTP协议扫盲(八 )响应报文之 Transfer-Encoding=chunked方式
一.什么是chunked编码? 分块传输编码(Chunked transfer encoding)是只在HTTP协议1.1版本(HTTP/1.1)中提供的一种数据传送机制.以往HTTP的应答中数据是整 ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- Struts中的数据处理的三种方式
Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...
- spring 整合 mybatis 中数据源的几种配置方式
因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...
- Qt中三种解析xml的方式
在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码.虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面 ...
- Struts2中的数据处理的三种方式对比(Action中三种作用域request,session,application对象)
1:在Action中如何获得作用域(request,session,application)对象: 取得Map(键值对映射集)类型的requet,session,application; 对数据操作的 ...
- C#中Post请求的两种方式发送参数链和Body的
POST请求 有两种方式 一种是组装key=value这种参数对的方式 一种是直接把一个字符串发送过去 作为body的方式 我们在postman中可以看到 sfdsafd sdfsdfds publi ...
- Spring中依赖注入的四种方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...
- JavaWeb应用中初始化Log4j的两种方式
本文主要介绍了普通JavaWeb应用(基于Tomcat)中初始化Log4j的两种方式: 1.通过增加 InitServlet ,设置令其自启动来初始化 Log4j . 2.通过监听器 ServletC ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
随机推荐
- 带你上手全新版本的Webpack 5
摘要:webpack5快速入门,船新版本,建议收藏 本文分享自华为云社区<webpack5快速入门,船新版本,建议收藏>,作者:北极光之夜.. 一. 快速上手 1.1 Webpack功能: ...
- 升级win11显示:此版本的windows不支持该处理器—如何强升win11?
今天的我微信笔记本 msi gp62 mvr 无论是win10升级到win11 还是安装win11都无法安装.显示: Windows 11不支持该处理器 win11系统升级标准要求相比win10来说有 ...
- Nginx在windows下常用命令
cmd 进入Nginx解压目录 执行以下命令 start nginx : 启动nginx服务 nginx -s reload :修改配置后重新加载生效 nginx -s reopen :重新打开日志文 ...
- 火山引擎数智平台 VeDI 帮助智能投影仪更懂用户需求
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当露营成为年轻人的一种全新生活方式后,连带着户外野营帐篷.可折叠桌椅.卡式炉.多人趣味桌游等露营周边市场都迎来新一 ...
- 动作捕捉用于验证芭蕾舞动作对脑瘫儿童的作用 NOKOV度量动作捕捉
下肢杠杆力臂功能障碍(Lever Arm Dysfunction,LAD)是常见的导致脑瘫儿童步态异常的原因,如髋内旋.股骨和胫骨之间的旋转畸形以及足的内外翻畸形等,且都与年龄的增长呈正相关. 图 ...
- C# RSA 非对称加密
代码: RSAHelper.cs(RSA加密工具类): using System; using System.Security.Cryptography; using System.Text; nam ...
- SpringBoot 项目集成 knife4j
文档地址:https://doc.xiaominfo.com/ knife4j 是为 Java MVC 框架集成Swagger生成 \(Api\) 文档的增强解决方案. Swagger介绍 前后端分离 ...
- L2-029 特立独行的幸福 (25分) (简单循环 + 素数筛)
对一个十进制数的各位数字做一次平方和,称作一次迭代.如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数.1 是一个幸福数.此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68, ...
- .NET CORE实战项目之CMS 部署篇 思维导图
.NET Core实战项目之CMS 第十七章 CMS网站系统的部署 如何优雅的利用Windows服务来部署ASP.NET Core程序
- ElasticSearch 通过 Kibana 与 ElasticSearch-head 完成增删改查
本文为博主原创,未经允许不得转载: 1. 安装并配置 elasticSearch ,kibana, elasticsearch-head docker 安装 ElasticSearch 和 Kiba ...
