gpt4 book ai didi

go - 停止单个goroutine的最佳方法?

转载 作者:行者123 更新时间:2023-12-01 21:16:07 25 4
gpt4 key购买 nike

在我的程序中,我有几个执行例程,它们实际上在运行无数个进程。为什么?您可能会问,总之,这是我整个应用程序的目的,因此改变它是毫无疑问的。我想让用户能够停止一个常规程序。我知道我可以使用channel发出停止例程的信号,但是在某些情况下,例如,我正在运行10个例程,而我只想停止1。问题是,例程的数量我要运行的是动态的并且基于用户输入。对我来说,增加能够动态停止执行例程并允许单打停止而又没有其他功能的最佳方法是什么?

最佳答案

您需要设计一个 map 来管理上下文。
假设您已经知道上下文的用法。它可能看起来像:

ctx, cancel := context.WithCancel(ctx.TODO())

go func(ctx){
for {

select {

case <-ctx.Done():
return
default:
// job
}
}
}(ctx)

cancel()
好的,现在您可以将您的问题转换为另一个问题,它可能称为“如何管理许多goroutine的上下文”
type GoroutineManager struct{
m sync.Map
}
func (g *GoroutineManager) Add(cancel context.CancelFunc, key string)) {
g.m.Store(key, cancel)
}

func (g *GoroutineManager) KillGoroutine(key string) {
cancel, exist := g.m.Load(key)
if exist {
cancel()
}
}

好的,现在您可以像这样管理goroutine了:
ctx, cancel := context.WithCancel(ctx.TODO())

manager.Add(cancel, "routine-job-1")
go func(ctx){
for {

select {

case <-ctx.Done():
return
default:
// job
}
}
}(ctx)


// kill it as your wish
manager.KillGoroutine("routine-job-1")

关于go - 停止单个goroutine的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63734384/

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