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

如何确定goroutine是否已完成而没有阻塞?

如何确定goroutine是否已完成而没有阻塞?

Go
翻阅古今 2021-04-15 12:15:44
到目前为止,我所看到的所有示例都涉及阻塞以获取结果(通过<-chan运算符)。我当前的方法涉及将指针传递给结构:type goresult struct {    result resultType;    finished bool;}goroutine完成时会写的内容。然后,finished只要方便就可以进行检查。您有更好的选择吗?我真正想要的是Qt风格的信号槽系统。我有一个预感,解决方案看起来几乎是微不足道的(chan有很多未开发的潜力),但是我对这种语言还不十分了解。
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您还可以通过使用len来窥视通道缓冲区以查看其是否包含任何内容:


if len(channel) > 0 {

  // has data to receive

}

这不会触摸通道缓冲区,与之不同的是foo, gotValue := <- ch,该缓冲区会在时删除一个值gotValue == true。


查看完整回答
反对 回复 2021-04-26
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

Select语句使您可以一次随机检查分支(在等待通信的分支中),以检查多个通道:


func main () {

    for {

    select {

        case w := <- workchan:

            go do_work(w)

        case <- signalchan:

            return

        // default works here if no communication is available

        default:

            // do idle work

    }

    }

}

对于“ select”语句中的所有发送和接收表达式,将按从上到下的顺序对通道表达式以及出现在发送表达式右侧的所有表达式进行评估。如果可以进行任何结果操作,则选择一个并评估相应的通信和语句。否则,如果存在默认情况,则执行;否则,将执行默认情况。如果不是,则语句将阻塞,直到其中一种通信可以完成。


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

添加回答

举报

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