我正在将数据写入网络。
写goroutine是这样的。
forend:
for{
select{
case buf,ok:=<-sendqueue:
if !ok{
break forend
}
writeBuffer(conn,buf)
}
}
Run Code Online (Sandbox Code Playgroud)
变量 conn 是一个 net.Conn。
那我想用bufio来代替net.Conn。
iowriter:=bufio.NewWriter(conn)
Run Code Online (Sandbox Code Playgroud)
iowriter 将缓存数据。为了减少延迟,我必须在发送队列中没有更多数据时立即刷新 iowriter。
所以我在编写 goroutine 中添加了一个 default case
forend:
for{
select{
case buf,ok:=<-sendqueue:
if !ok{
break forend
}
writeBuffer(iowriter,buf)
default:
iowriter.Flush()
time.Sleep(time.Millisecond)
}
}
Run Code Online (Sandbox Code Playgroud)
time.Sleep 是必须的,否则 goroutine 会运行 busy loop。
但在这种情况下,真正的需求是阻塞不睡觉。
最后,我找到了一个解决方案,有两个选择。
forend:
for{
select{
case buf,ok:=<-sendqueue:
if !ok{
break forend
}
writeBuffer(iowriter,buf)
}
nextloop:
for{
select{
case buf,ok:=<-sendqueue:
if !ok{
break forend
}
writeBuffer(iowriter,buf)
default:
iowriter.Flush()
break nextloop …Run Code Online (Sandbox Code Playgroud)