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

标签 go goroutine

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

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

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

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

我的问题是:

  1. 如何终止上述示例中的 goroutine?
  2. 有没有办法知道每个goroutine使用的内存?

更新

  1. 我读了其他关于 goroutine 不能在外面被杀死的 SO 答案
  2. 我认为向 goroutine 处理的 channel 发送信号以使 goroutine 退出仅适用于基于循环的逻辑
  3. 我正在寻找一些最佳实践来为基于流的逻辑关闭 goroutine。

最佳答案

如果您range 是您的步骤的函数列表,您应该能够轻松地将其适应for 循环:

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 上试试.

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

关于go - 如何关闭运行基于流的逻辑的 goroutine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39632932/

相关文章:

go - binary.Uvarint 得到的 int 值比预期错误

go - go中的移动线位置(使用标准输出)

go - context.WithValue : how to add several key-value pairs

http - 如何在执行响应中不需要的计算之前向客户端发送响应

戈朗 : fatal error: all goroutines are asleep - deadlock

concurrency - 等待 n 个 goroutine 终止

performance - 在 golang 中,使用 make 与 {} 初始化的 map 之间是否存在任何性能差异

Go - 追加到结构中的 slice

Golang 模板函数返回空白页

go - 这里有资源泄漏吗?