登录
首页 >  Golang >  Go问答

在使用 Reader 接口执行 select 查询时的规范

来源:stackoverflow

时间:2024-03-23 17:27:30 339浏览 收藏

在使用 Reader 接口执行 Select 查询时,采用同步 API(如 Read)将其转换为异步操作具有挑战性。本文提出了一种解决方案,即创建新的 goroutine 来执行读取并将输出写入通道。这允许第一个 goroutine 同时阻塞在通道和原始阻塞通道上,从而在读取延迟的情况下避免孤立资源。

问题内容

我封装了一个队列来实现 writerreader 接口(分别用于推送和弹出)。

我需要持续监听队列,并处理通过的每条消息。当队列表示为通道时,这很简单,但否则会更困难:

loop:
    for {
        var data []byte
        select {
            case <-done:
                break loop
            case _, err := queue.Read(data):
                fmt.Println(string(data))
        }
    }

执行此操作的正确方法是什么? read 这里是阻塞的 - 它会等待,直到队列有消息。

是否有更好、更惯用的方法来实现这一目标?


解决方案


采用同步 API(如上面描述的queue.Read)并使其异步比执行相反的操作更困难。

这个想法是创建一个新的 goroutine(例如使用 go func() {...})并让该 goroutine 执行读取并将输出写入通道。

然后第一个 goroutine 将阻塞在该通道以及它已经阻塞的通道上。

如果读取时间过长,这可能会在一段时间内留下孤立资源,但如果您有同步 API,那么这是您能做的最好的事情。

理论要掌握,实操不能落!以上关于《在使用 Reader 接口执行 select 查询时的规范》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>