为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
BIG阳 2021-04-10 14:15:13
因此,现在,我只需将指针传递给Queue对象(实现并不重要),然后queue.add(result)在应将事物添加到队列的goroutine的末尾调用。我需要相同的功能-当然,与简单的队列添加函数调用相比,就性能而言,使用逗号ok语法进行循环检查完成情况是不可接受的。有没有办法更好地做到这一点?
查看完整描述

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的方式是通过创建几个通过伪值传递的通道,以确保清理正确完成。这些通道没有特别缓冲,因此发送以锁定步骤进行。


查看完整回答
反对 回复 2021-04-26
  • 1 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信