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

到目前为止,我所看到的所有示例都涉及阻塞以获取结果(通过<-chan运算符)。


我当前的方法涉及将指针传递给结构:


type goresult struct {

    result resultType;

    finished bool;

}

goroutine完成时会写的内容。然后,finished只要方便就可以进行检查。您有更好的选择吗?


我真正想要的是Qt风格的信号槽系统。我有一个预感,解决方案看起来几乎是微不足道的(chan有很多未开发的潜力),但是我对这种语言还不十分了解。


翻阅古今
浏览 247回答 3
3回答

莫回无

您还可以通过使用len来窥视通道缓冲区以查看其是否包含任何内容:if len(channel) > 0 {&nbsp; // has data to receive}这不会触摸通道缓冲区,与之不同的是foo, gotValue := <- ch,该缓冲区会在时删除一个值gotValue == true。

天涯尽头无女友

Select语句使您可以一次随机检查分支(在等待通信的分支中),以检查多个通道:func main () {&nbsp; &nbsp; for {&nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case w := <- workchan:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; go do_work(w)&nbsp; &nbsp; &nbsp; &nbsp; case <- signalchan:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; // default works here if no communication is available&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // do idle work&nbsp; &nbsp; }&nbsp; &nbsp; }}对于“ select”语句中的所有发送和接收表达式,将按从上到下的顺序对通道表达式以及出现在发送表达式右侧的所有表达式进行评估。如果可以进行任何结果操作,则选择一个并评估相应的通信和语句。否则,如果存在默认情况,则执行;否则,将执行默认情况。如果不是,则语句将阻塞,直到其中一种通信可以完成。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go