【发布时间】:2020-05-23 16:25:22
【问题描述】:
我第一次在这里发帖,因为我在互联网上找不到干净的解决方案。
我的目标很简单,我需要创建一个后台操作(goroutine或进程或其他什么...),我可以正确杀死(不要留在后台)。
我尝试了很多方法,例如使用 chan 或 context。
但我始终找不到避免泄漏的正确方法。
这是一个例子:
package main
import (
"log"
"strconv"
"runtime"
"time"
"math/rand"
)
func main() {
log.Println("goroutines: " + strconv.Itoa(runtime.NumGoroutine()))
func1()
leak := ""
if runtime.NumGoroutine() > 1 {
leak = " there is one LEAK !!"
}
log.Println("goroutines: " + strconv.Itoa(runtime.NumGoroutine()) + leak)
}
func func1() {
done := make(chan struct{})
quit := make(chan struct{})
go func() {
log.Println("goroutines: " + strconv.Itoa(runtime.NumGoroutine()))
select {
case <-quit:
log.Println("USEFUL ???")
return
default:
func2()
done<-struct{}{}
}
}()
select {
case <-time.After(4 * time.Second):
quit<-struct{}{}
log.Println("TIMEOUT")
case <-done:
log.Println("NO TIMEOUT")
}
}
func func2() {
log.Println("JOB START")
rand.Seed(time.Now().UnixNano())
val := rand.Intn(10)
log.Println("JOB DURATION: " + strconv.Itoa(val))
time.Sleep(time.Duration(val) * time.Second) // fake a long process with an unknown duration
log.Println("JOB DONE")
}
在这个例子中,如果工作在 4 秒超时之前完成,一切都很好,goroutine 的最终数量将为 1,否则它将像我能找到的每个示例一样为 2。
但这只是一个例子,也许用 goroutines 不可能,甚至在 Go 中也不可能......
【问题讨论】:
-
这能回答你的问题吗? Stop goroutine execution on timeout
-
谢谢,我已经看过那个帖子了;他们说杀死一个 goroutine 是不可能的;很好,但这只是一个例子,我不关心 goroutines。就像我写的那样,我只想杀死 Go 中的后台操作,但我不知道该怎么做 :) 如果您有任何建议
标签: go concurrency kill