小编海牙客*_*客移库的帖子

如何在golang中阻止选择默认情况?

我正在将数据写入网络。
写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)

select channel go

3
推荐指数
1
解决办法
4892
查看次数

标签 统计

channel ×1

go ×1

select ×1