代码之家  ›  专栏  ›  技术社区  ›  György Andrasek

我怎样才能在不阻塞的情况下确定Goroutine是否完成了?

  •  8
  • György Andrasek  · 技术社区  · 15 年前

    到目前为止,我看到的所有示例都涉及到阻塞以获得结果(通过 <-chan 操作员)。

    我目前的方法是将一个指针传递给一个结构:

    type goresult struct {
        result resultType;
        finished bool;
    }
    

    这是Goroutine在完成时写的。那么这是一个简单的检查问题 finished 只要方便。你有更好的选择吗?

    我真正的目标是一个qt型的信号槽系统。我有种预感,解决方案看起来几乎微不足道( chan 太多了 但我对语言还不太熟悉,无法理解。

    3 回复  |  直到 15 年前
        1
  •  13
  •   hasen    15 年前

    您可以使用“逗号,确定”模式(请参见其页面上的) effective go “”:

    foo     := <- ch; // This blocks.
    foo, ok := <- ch; // This returns immediately.
    
        2
  •  5
  •   u0b34a0f6ae    15 年前

    Select statements 允许您一次检查多个通道,使用随机分支(通信等待的分支):

    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”语句中的表达式, 计算通道表达式, 以及出现的任何表达式 在send的右边 表达式,按从上到下的顺序。 如果任何结果操作可以 继续,选择一个,然后 相应的沟通和 对语句进行计算。否则, 如果存在默认情况,则 执行;如果不执行,语句将阻塞 直到有人能 完成。

        3
  •  4
  •   William Casarin    15 年前

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

    if len(channel) > 0 {
      // has data to receive
    }
    

    这不会碰到通道缓冲区,不像 foo, gotValue := <- ch gotValue == true .