我有两个goroutine,如下面的代码片段所示。我想同步它们,以便当一个返回时,另一个也应该退出。实现此目标的最佳方法是什么?

func main() {

  go func() {
    ...
    if err != nil {
      return
    }
  }()

  go func() {
    ...
    if err != nil {
      return
    }
  }()


}

我在https://play.golang.org/p/IqawStXt7rt上模拟了这种情况,并尝试通过一个信号处理例程的 channel 解决它。看起来可能存在对关闭 channel 的写入操作,导致出现紧急情况。解决此问题的最佳方法是什么?

最佳答案

您可以使用上下文在两个go例程之间进行通信。
例如,

package main

import (
    "context"
    "sync"
)

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    wg := sync.WaitGroup{}
    wg.Add(3)
    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        // your operation
        // call cancel when this goroutine ends
        cancel()
    }()
    wg.Wait()
}

关于go - Golang模式可一次杀死多个goroutine,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61007385/

10-12 23:08