我有一些像这样的goroutine逻辑:
go func() {
do_things_0()
do_things_1()
do_things_2()
do_things_3()
...
...
} ()
当服务收到请求时,它将创建这样的goroutine。而goroutine可能耗费内存,需要运行超过30分钟。
有时,服务可能会注意到内存不足,需要终止一些goroutines。
我的问题是:
更新
for loop based logics
。flow based logics
。答案 0 :(得分:1)
如果for
超过了您的步骤列表,您应该可以轻松地将其调整为range
循环:
package main
import (
"fmt"
"time"
)
func a() { fmt.Printf("a") }
func b() { fmt.Printf("b") }
func c() { fmt.Printf("c") }
func d() { fmt.Printf("d") }
func e() { fmt.Printf("e") }
func f(quit <-chan struct{}) {
for i := 0; i < 10000; i++ {
for _, fn := range []func(){a, b, c, d, e} {
select {
case _, _ = <-quit:
fmt.Println("quit f")
return
default:
fn()
time.Sleep(1 * time.Millisecond)
}
}
}
}
func main() {
quit := make(chan struct{})
fmt.Println("go f")
go f(quit)
fmt.Println("sleep")
time.Sleep(100 * time.Millisecond)
fmt.Println("\nquit")
close(quit)
time.Sleep(10 * time.Millisecond)
fmt.Println("exit")
}
在playground上尝试。
外部循环就是重复这些步骤足够长的时间,我们可以看到退出命令发生。