如何在不阻塞的情况下查明goroutine是否已完成?

Gyö*_*sek 8 go signals-slots goroutine

到目前为止我见过的所有例子都涉及阻塞以获得结果(通过<-chan运算符).

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

type goresult struct {
    result resultType;
    finished bool;
}
Run Code Online (Sandbox Code Playgroud)

goroutine在完成后写的.然后,finished只要方便,就可以轻松检查.你有更好的选择吗?

我真正的目标是Qt风格的信号槽系统.我有预感,解决方案看起来几乎是微不足道的(chan许多未探索的潜力),但我还不熟悉这种语言来解决它.

Jam*_*ill 13

您可以使用"逗号,确定"模式(请参阅" 有效去 " 页面):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.
Run Code Online (Sandbox Code Playgroud)


u0b*_*6ae 5

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
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Wil*_*rin 5

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

if len(channel) > 0 {
  // has data to receive
}
Run Code Online (Sandbox Code Playgroud)

这不会碰到通道缓冲区,foo, gotValue := <- ch这与在时删除值不同gotValue == true