【发布时间】:2016-10-06 14:51:38
【问题描述】:
在 go 中是否有可能推迟 go 例程或实现所需行为的方法?以下背景:我在通道中汇集与数据库的连接。基本上在我调用的处理程序中
session, err := getSessionFromQueue()
// ...
// serving content to my client
// ...
go queueSession(session)
我真正想做的是:
session, err := getSessionFromQueue()
defer go queueSession(session)
// ...
// serving content to my client
// ...
为了避免我的处理程序在某个时候挂起/崩溃,并且会话没有正确返回到队列中。我想将其作为 go 例程运行的原因是 queueSession 可能会阻塞 1 秒钟(如果队列已满,我会等待一秒钟,然后才能完全关闭会话)。
更新
@abhink 让我走上了正确的道路。我通过在queueBackend 中调用goroutine 解决了这个问题。
func queueSession(mongoServer *Server) {
go func(mongoServer *Server) {
select {
case mongoQueue <- mongoServer:
// mongoServer stored in queue, done.
case <- time.After(1 * time.Second):
// cannot queue for whatever reason after 1 second
// abort
mongoServer.Close()
}
}(mongoServer)
}
现在我可以简单地调用
defer queueSession(session)
它作为一个 goroutine 运行。
【问题讨论】: