并发发送/接收通道

Qia*_*hen 4 concurrency channel go

我有一个调用go通道queue,让我们说100作为缓冲区大小.许多go例程可以将数据发送到此通道,另一个例程就是坐在那里从该通道接收数据.这是一个持久的过程,意味着渠道的作用就像一条管道,从多个目的吸收数据,并将数据汇到一端.我在接收程序中做了类似的事情:

for {
    for data := range queue {
        sink(data)
    }
} 
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:如果在范围循环结束之前将一些新数据发送到通道缓冲区会怎样.新数据是否可用于下一个范围循环?如果在这种情况下没有考虑并发性,他们会被遗漏?

Tim*_*per 5

你只需要一个for循环.从范围表达式规范:

对于通道,产生的迭代值是在通道上发送的连续值,直到通道关闭.如果通道是nil,则范围表达式永远阻塞.

在这种情况下,范围循环在例如切片上不像常规范围那样起作用.相反,当可以从通道读取项目时,循环体处理它.因此,您的嵌套循环应替换为以下内容:

for data := range queue {
    sink(data)
}
Run Code Online (Sandbox Code Playgroud)