如何管理Go协程并停止特定的Go协程

huangapple go评论81阅读模式
英文:

How to manage go routines and stop a specific go routine

问题

这是一个抽象的例子,用于说明实际情况。我必须通过调用函数B来停止函数A创建的某些特定的go routine。

func A(context, interval, ...params) {
 go (interval) {
    tk := time.ticker(interval)
    for {
      select {
       case <- tk.C:
        err := func C(params)
     }
    }
  }(interval)
}

(func A) 创建一个go routine,以特定的参数和重复的时间间隔执行(func C)。

func B(context, ...params) {
  // 停止运行具有特定参数的go routine,该go routine运行(func C)。
}

(func B) 需要停止运行具有给定参数的go routine,该go routine运行(func C)。
另外,我该如何处理(func A)中的错误和上下文超时的情况?

注意:提供的是伪代码,真实代码无法共享。

英文:

This is an abstract example to real case, I have to stop some specific go routine created by a func A by calling func B

func A(context, interval, ...params) {
 go (interval) {
    tk := time.ticker(interval)
    for {
      select {
       case &lt;- tk.C:
        err := func C(params)
     }
    }
  }(interval)
}

(func A) creates go routine executing (func C) at repeated interval with specific parameters.

func B(context, ...params) {
  // stop go routine that runs func C with specific params.
}

(func B) needs to stop go routine running (func C) with given parameters.
Also how can I handle cases like error and context timeout in (func A).

note: pseudo code provided, sorry real code cannot be shared.

答案1

得分: 2

我相信你正在寻找context.Done

> Done返回一个通道,当代表此上下文的工作完成时,该通道将关闭。

select {
case <-ctx.Done():
	// 上下文被取消,停止goroutine
	return
case <-tk.C:
	C(params...)
}

工作示例: https://go.dev/play/p/wSUHSHCse7D

没有简单的方法可以根据参数找到基于goroutine的上下文,所以你需要稍微调整一下代码,选择要取消的上下文。

英文:

I believe you're looking for context.Done.

> Done returns a channel that's closed when work done on behalf of this context should be canceled.

select {
case &lt;-ctx.Done():
	// context was cancelled, stop goroutine
	return
case &lt;-tk.C:
	C(params...)
}

Working example: https://go.dev/play/p/wSUHSHCse7D

There is no simple way of finding goroutine based on params so you have to adjust your code a little bit to select which context you want to cancel.

huangapple
  • 本文由 发表于 2022年3月17日 15:54:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/71508759.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定