登录
首页 >  Golang >  Go问答

如何优雅地终止 goroutine

来源:stackoverflow

时间:2024-03-26 20:45:28 380浏览 收藏

在并行程序中,当一个错误发生时,如何优雅地终止其他正在运行的 goroutine?本文提供了一种解决方案,通过使用公共上下文来协调多个 goroutine,并通过取消上下文在发生错误时终止所有等待的请求。这种方法可以确保程序在发生错误时以受控和优雅的方式退出,避免资源泄漏和意外行为。

问题内容

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

我必须使用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)
}

解决方案


公共上下文应该能够取消所有等待的请求。像这样的事情:

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 请求也应该取消。

终于介绍完啦!小伙伴们,这篇关于《如何优雅地终止 goroutine》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>