在完成时将频道结果添加到队列的更惯用的方法

因此,现在,我只需将指针传递给Queue对象(实现并不重要),然后queue.add(result)在应将事物添加到队列的goroutine的末尾调用。

我需要相同的功能-当然,与简单的队列添加函数调用相比,就性能而言,使用逗号ok语法进行循环检查完成情况是不可接受的。

有没有办法更好地做到这一点?


BIG阳
浏览 221回答 1
1回答

缥缈止盈

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

相关分类

Go