假设我正在golang中编写REST Web服务。在内部,我有几个工作goroutine做事情。这样的goroutine是由HTTP API按需触发的。当然,我想以某种方式监控这些goroutines的进展。通常会有goroutine发送更新,错误等的通道。主程序会在这些通道上执行select
。
但是,因为主程序的偶数循环忙于http.ListenAndServe()
,所以我看不到实现此目的的方法。鉴于这似乎是一个非常普遍的问题,我想知道是否存在我缺少的设计模式。
[编辑]
更多技术细节。所以我有一个Resource
类来管理资源池。 Resource.DoSomething()
是一个很长的操作,所以它会在背后踢出一个goroutine。将打开一个频道以允许轮询状态。
当某个HTTP请求进入时,会触发此DoSomething()
。但我没有上下文来调查状态。目前我的愚蠢计划是在下一个 HTTP请求进入时轮询通道输入。这应该足够但不理想 - 我想知道该goroutine正在发生什么。< / p>
答案 0 :(得分:3)
启动Go例程以专门运行包含监控的选择,将select放入其自己的for
循环中:
func main() {
go func() {
for {
select {
//TODO: Insert Code Here?
}
}
}()
err := http.ListenAndServe()
if err != nil {
//TODO:
}
}