Go批量读取channel的数据
package main
import (
"fmt"
"time"
)
func batchProcessor(ch <-chan string, batchSize int, flushInterval time.Duration) {
var batch []string
timer := time.NewTimer(flushInterval)
for {
select {
case data := <-ch:
batch = append(batch, data)
// 当缓冲区达到批量大小时处理
if len(batch) >= batchSize {
fmt.Printf("Processing batch: %v\n", batch)
batch = nil
// 重置定时器
timer.Reset(flushInterval)
}
case <-timer.C:
// 如果达到时间间隔,但 batch 不为空,也进行处理
if len(batch) > 0 {
fmt.Printf("Processing batch on timer: %v\n", batch)
batch = nil
}
// 重置定时器
timer.Reset(flushInterval)
}
}
}
func main() {
dataChannel := make(chan string)
batchSize := 5
flushInterval := 3 * time.Second
// 启动批量处理协程
go batchProcessor(dataChannel, batchSize, flushInterval)
// 模拟向 channel 发送数据
for i := 1; i <= 10; i++ {
dataChannel <- fmt.Sprintf("data-%d", i)
time.Sleep(1 * time.Second)
}
// 让主程序暂停一会,以便查看处理结果
time.Sleep(5 * time.Second)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?