【问题标题】:How to stop a goroutine when an error occurs [duplicate]发生错误时如何停止goroutine [重复]
【发布时间】:2019-11-15 02:44:27
【问题描述】:

当一个错误发生时,如何停止另一个?

我必须使用 res1 和 res2,在生产中 res1,res2 不是同一个静态类型。

package main

import (
    "fmt"
    "net/http"
    "sync"
)

func main() {
    wg := &sync.WaitGroup{}
    wg.Add(2)

    var res1, res2 *http.Response
    var err1, err2 error

    go func() {
        defer wg.Done()
        res1, err1 = http.Get("http://127.0.0.1:8899")
        if err1 != nil {
            panic(err1)
        }
    }()
    go func() {
        defer wg.Done()
        res2, err2 = http.Get("http://127.0.0.1:8898")
        if err2 != nil {
            panic(err2)
        }
    }()
    wg.Wait()

    fmt.Println(res1, res2)
}

【问题讨论】:

    标签: go goroutine


    【解决方案1】:

    一个通用的上下文应该能够取消所有等待的请求。像这样的:

    ctx, cancel:=context.WithCancel(context.Background())
    defer cancel()
    cli:=http.Client{}
    go func() {
       req:=http.NewRequestWithContext(ctx,http.MethodGet,url,nil)
       respose, err:=cli.Do(req)
       if err != nil {
         cancel()
         return
       }
    }()
    

    你应该对所有的http请求使用相同的ctx,当一个失败时,取消它。取消上下文后,所有其他 http 请求也应取消。

    【讨论】:

    • 在上面的例子中,每次 go-routine 运行时都会创建一个新的客户端。由于 OP 有两个常规任务,我是否可以建议使用共享的通用 http.Client。
    • @colminator,谢谢,将 cli 移到 goroutine 之外
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 2023-04-04
    • 2020-04-03
    • 2022-11-10
    • 1970-01-01
    • 2011-10-12
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多