为了账号安全,请及时绑定邮箱和手机立即绑定

如果我们无法从传递给该例程的通道收听,如何停止 goroutine

如果我们无法从传递给该例程的通道收听,如何停止 goroutine

Go
达令说 2023-06-05 16:56:23
我遇到了一个关于 goroutines 的问题。假设有一个通道,我们通过来自 main 的 goroutine 传递这个通道。现在,如果我们无法从 main 收听此频道(以防在收听之前发生返回/恐慌)。goroutine 不会停止。如果出现错误,如何停止这个 goroutine?如果多次调用 goroutine 中的函数,例程的数量会不断增加。package mainimport (    "fmt"    "runtime")func test(a chan string) {    defer func() {        close(a)        fmt.Println("channel close")    }()    fmt.Println("sending to channel")    a <- "1"    fmt.Println("sent to channel")}func method() string {    fmt.Println("method starting no. of routine=>",        runtime.NumGoroutine())    b := make(chan string)    go test(b)    fmt.Println("method current no. of routine=>",        runtime.NumGoroutine())    return "error" //if this is executed the routines keeps on    //increasing    a := <-b    return a}func main() {    defer fmt.Println("final main no. of routine=>",        runtime.NumGoroutine())    i := 0    //firing 10 request for method    for {        if i < 10 {               fmt.Println(method())               i++        } else {               break        }    }}输出:method starting no. of routine=> 1method current no. of routine=> 2errormethod starting no. of routine=> 2method current no. of routine=> 3errormethod starting no. of routine=> 3method current no. of routine=> 4error.....继续这样增加
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

例程可以根据上下文停止。在使用上下文之前,您应该知道只有带有循环的例程才需要停止控制,那些死例程不需要停止。


上下文示例:


func main(){

    ctx, cancel := context.WithCancel(context.Background())

    go func(c context.Context){

        for {

            select{

                case <-c.Done():

                   fmt.Println("exit success")

                default:

                   // service

                   fmt.Println("my logic service loop")

            }    

        }

    }(ctx)

    time.Sleep(5 * time.Second)

   cancel()

}


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信