go - 在 select 语句中使用 Reader 接口(interface)时的约定

标签 go select blocking reader

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

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

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 执行读取并将输出写入 channel 。

然后第一个 goroutine 将阻塞该 channel 和它已经阻塞的 channel 。

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

关于go - 在 select 语句中使用 Reader 接口(interface)时的约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028252/

相关文章:

go - golang 上的公历包

go - 在不影响当前进程的情况下,使用 rlimit 限制子进程的内存使用

php - 选择一个以逗号分隔的字段

scala - 在 Play 中,每个请求都会产生一个 Akka Actor 吗?

ios - 可以在 iPhone 上管理通话吗?

Go/Golang : how to extract least significant digits from big. float ?

go - 如何使用 reflect.Type 对 switch 进行断言

php - MySql中的上一条记录

php mysql_query 相关查询

java - SocketChannel.read() 无限期阻塞