• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

添加频道结果到队列完成的更习惯的方式

go 来源:Aaron Yodaiken 6次浏览

所以,现在,我只是传递一个指向Queue对象的指针(实现并不重要),并在goroutine的末尾调用queue.add(result),它应该将事物添加到队列。添加频道结果到队列完成的更习惯的方式

我需要相同类型的功能 – 当然,使用逗号ok语法执行循环检查完成在性能方面与简单队列添加函数调用相比是不可接受的。

有没有办法做到这一点更好,或不?


===========解决方案如下:

你的问题实际上有两个部分:如何在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也指出),因为你有两个goroutines写入通道,其中一个必须负责关闭通道。另外,我之前的修订版会在processObjects完成之前退出。我选择同步goroutine的方式是创建一个更多的通道来传递虚拟值,以确保清理完成正确。这些通道是专门无缓冲的,以便发送以锁步方式发送。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)