gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:04 24 4
gpt4 key购买 nike

我遇到了一个关于 goroutines 的问题。假设有一个 channel ,我们通过来自 main 的 goroutine 传递这个 channel 。现在,如果我们无法从 main 收听此 channel (以防在收听之前发生返回/ panic )。 goroutine 不会停止。如何在出错时停止这个 goroutine?

在多次调用goroutine中的函数的情况下,routine的数量不断增加。

package main

import (
"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=> 1

method current no. of routine=> 2

error

method starting no. of routine=> 2

method current no. of routine=> 3

error

method starting no. of routine=> 3

method current no. of routine=> 4

error

.....就这样一直增加

最佳答案

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

上下文示例:

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()
}

关于go - 如果我们无法从传递给该例程的 channel 收听,如何停止 goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54475516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com