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中实现此目标的方式是什么?
这样的事情应该起作用:
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)