-
Notifications
You must be signed in to change notification settings - Fork 162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
pool: 重构去除 OnDemandBlockTaskPool 中的 context.Context 字段 #65
Comments
之所以用ctx是想表达在成功调用ShutdownNow那一刻,所有处于“可中断上下文”中的go协程均能收到中断信号.这其中不仅包括了schedulingTasks任务调度循环,还包括那些运行中且内部监听了ctx信号的Task func (b *OnDemandBlockTaskPool) schedulingTasks() {
// .....
// 这里向task传递的正是那个ctx,对于那些在内部监听了ctx.Done()的Task
// 使其以自定义方式更快速地中断运行
err := task.Run(b.ctx)
if err != nil {
return
}
}()
}
}
} https://github.com/gotomicro/ekit/blob/dev/pool/task_pool.go#L253 |
👍 |
@longyue0521 @flycash 有几点疑问,请大佬指点: 2、372行注释不对吧(刚启动的协程除非恰巧赶上Shutdown/ShutdownNow被调用,否则应该至少执行一个task),如果initGo是10,用户只提交了2个任务,那剩余8个goroutine不会执行任务,所以不会至少执行一个task吧 |
|
这是来自QQ邮箱的自动回复邮件。
您好,您的邮件已收到。我会尽快给您回复。
|
仅限中文
当前实现缺陷
目前的 OnDemandBlockTaskPool 的定义里面使用了 context.Context 来作为字段类型,核心是用它来作为关闭的通知:
但是从语义上来说,context.Context 所表达的是一个上下文概念,一般用作方法参数。即便不是用作方法参数,也是用在 http.Request 这种,和请求生命周期保持一致的场景中。
TaskPool 不同于此。TaskPool 的生命周期可以认为是极其漫长的,大多数的使用场景都是在应用或者服务启动的时候创建一个,而后在服务或者应用关闭的时候销毁。也就是说,它会跨越多个请求。
在这种场景之下,使用 context.Context 作为参数则不太合适了。
重构方案
我们可以考虑使用简单的 channel 来发送关闭信号:
其它
要注意,最好将容量设置为1,并且在发送了关闭信号之后,要把 channel 给关闭掉
你使用的是 ekit 哪个版本?
你设置的的 Go 环境?
The text was updated successfully, but these errors were encountered: