1 回答
TA贡献2041条经验 获得超4个赞
您的问题实际上有两部分:如何在Go中排队数据,以及如何在不阻塞的情况下使用通道。
对于第一部分,听起来您需要做的是代替使用通道将内容添加到队列中,而是将通道用作队列。例如:
var (
ch = make(chan int) // You can add an int parameter to this make call to create a buffered channel
// Do not buffer these channels!
gFinished = make(chan bool)
processFinished = make(chan bool)
)
func f() {
go g()
for {
// send values over ch here...
}
<-gFinished
close(ch)
}
func g() {
// create more expensive objects...
gFinished <- true
}
func processObjects() {
for val := range ch {
// Process each val here
}
processFinished <- true
}
func main() {
go processObjects()
f()
<-processFinished
}
至于如何使其更具异步性,您可以(如cthom06所指出的那样)将第二个整数传递给第二行中的make调用,这将使发送操作异步进行,直到通道的缓冲区已满。
编辑:但是(如cthom06也指出),因为您有两个写入通道的goroutine,所以其中之一必须负责关闭通道。另外,我的上一个修订版本将在processObjects完成之前退出。我选择同步goroutine的方式是通过创建几个通过伪值传递的通道,以确保清理正确完成。这些通道没有特别缓冲,因此发送以锁定步骤进行。
- 1 回答
- 0 关注
- 220 浏览
添加回答
举报