为了账号安全,请及时绑定邮箱和手机立即绑定

停止单个 goroutine 的最佳方法?

停止单个 goroutine 的最佳方法?

Go
潇湘沐 2022-06-27 15:45:43
在我的程序中,我有几个 go-routines,它们本质上是在运行无穷无尽的进程。为什么?您可能会问,长话短说,这是我整个应用程序的目的,所以改变它是不可能的。我想让用户能够停止单个 go-routine。我知道我可以使用 channel 来通知 go-routines 停止,但是可能有我有 10 个 go-routines 正在运行而我只想停止 1 个的情况。问题是 go-routines 的数量我想运行是动态的并且基于用户输入。对我来说,添加动态停止 go-routine 并允许单打停止的最佳方法是什么?
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

您需要设计一个地图来管理上下文。


假设您已经知道上下文的用法。它可能看起来像:


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")


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号