从Go中的一个通道读取多个元素

lau*_*ent 3 channel go batch-processing

我在这样的循环中从通道读取值:

for {
    capturedFrame := <-capturedFrameChan
    remoteCopy(capturedFrame)
}
Run Code Online (Sandbox Code Playgroud)

为了提高效率,我想批量读取这些值,如下所示(伪代码):

for {
    capturedFrames := <-capturedFrameChan
    multipleRemoteCopy(capturedFrames)
}
Run Code Online (Sandbox Code Playgroud)

但是我不确定该怎么做。如果我capturedFrames := <-capturedFrameChan多次打电话,它将被阻止。

基本上,我想读取其中的所有可用值captureFrameChan,如果没有可用的值,则照常阻塞。

在Go中实现此目标的方式是什么?

Hec*_*orJ 6

这样的事情应该起作用:

for {
    // we initialize our slice. You may want to add a larger cap to avoid multiple memory allocations on `append`
    capturedFrames := make([]Frame, 1)
    // We block waiting for a first frame
    capturedFrames[0] = <-capturedFrameChan

forLoop:
    for {
        select {
        case buf := <-capturedFrameChan:
            // if there is more frame immediately available, we add them to our slice
            capturedFrames = append(capturedFrames, buf)
        default:
            // else we move on without blocking
            break forLoop
        }
    }

    multipleRemoteCopy(capturedFrames)
}
Run Code Online (Sandbox Code Playgroud)