go - 有条件地停止其他goroutine

标签 go concurrency channel goroutine

我很怀疑我所有生成的goroutine在完成分配的工作后是否都快死了。
我必须进行两个HTTP调用(始终),但是基于一个标志,请从其中一个中读取响应。
到目前为止,我所做的是->

    var result error
    resultChannel := make(chan error)

    var wg sync.WaitGroup
    wg.Add(1)  // only adding 1, as I don't need to wait for other to complete.

    go func() {
        _, err := // HTTP call ONE
        if flagIsTrue {
            defer wg.Done()
            resultChannel <- err
        }
    }()
    go func() {
        _, err :=  // HTTP call TWO
        if !flagIsTrue {
            defer wg.Done()
            resultChannel <- err
        }
    }()

    go func() {
        wg.Wait()
        close(resultChannel)
    }()

    for err := range resultChannel {
        result = err
    }
因此,我将等待相应的调用,并仅收听其响应。这运行良好,但是由于该应用程序已部署在服务器上,所以我想主goroutine不会死(因此杀死其他goroutine),我主要担心的是其他可忽略线程在获取线程后是否会死掉。来自HTTP调用的响应(afaik,我们需要告诉goroutine需要消亡)。
我的担心:
  • 假设(对我而言是真实的)主线程在服务于这些调用之一后不会终止。
  • ignorable(响应是,但必须触发API调用)线程会死吗?
  • 我是否应该使用select案例来解决这个问题,如果可以,那么如何(欢迎其他建议)?
  • 最佳答案

    如果在创建goroutine之前设置了flagIsTrue,则只有其中一个goroutine能够写入 channel 。另一个将不尝试写入 channel ,因此将终止。
    您可以简单地将标志的检查移到外面,然后根据标志创建一个goroutine。

    关于go - 有条件地停止其他goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849747/

    相关文章:

    go - 在 Go 中递归创建目录的最惯用的方法是什么?

    sockets - binary.Write to socket in go blocks

    java - 等待监听器完成

    audio - Directshow中音频 channel 的数量大于2时,如何控制每个 channel 的音量?

    go - 如何修复2个 channel 相互死锁

    go - 接受与接受 TCP

    go - 在 go 中使用接口(interface)进行依赖注入(inject)

    java - volatile 变量和非 volatile 重新排序/可见性

    Java并发和循环任务执行

    youtube - 如何将所有YouTube channel 视频嵌入网站..?