我很怀疑我所有生成的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需要消亡)。我的担心:
最佳答案
如果在创建goroutine之前设置了flagIsTrue
,则只有其中一个goroutine能够写入 channel 。另一个将不尝试写入 channel ,因此将终止。
您可以简单地将标志的检查移到外面,然后根据标志创建一个goroutine。
关于go - 有条件地停止其他goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849747/