英文:
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 <- 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 <-ctx.Done():
// context was cancelled, stop goroutine
return
case <-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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论