如何关闭运行基于流的逻辑的goroutine?

时间:2016-09-22 07:33:16

标签: go goroutine

我有一些像这样的goroutine逻辑:

go func() {
    do_things_0()
    do_things_1()
    do_things_2()
    do_things_3()
    ...
    ...
} ()

当服务收到请求时,它将创建这样的goroutine。而goroutine可能耗费内存,需要运行超过30分钟。

有时,服务可能会注意到内存不足,需要终止一些goroutines。

我的问题是:

  1. 如何在上面的示例中终止goroutine?
  2. 有没有办法知道每个goroutine的已用内存?
  3. 更新

    1. 我读了其他SO的答案,goroutine不能在外面被杀死
    2. 我认为向goroutine处理的频道发送信号以使goroutine退出仅适用于for loop based logics
    3. 我正在寻找一些关闭flow based logics
    4. 的goroutine的最佳做法

1 个答案:

答案 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上尝试。

外部循环就是重复这些步骤足够长的时间,我们可以看到退出命令发生。