3
は、行くルーチンを延期するか、目的の動作を達成するための方法がありますか?次の背景:チャネルのデータベースへの接続をプールしています。基本的に私は私が本当にやりたい何goroutineを延期することはできますか?
session, err := getSessionFromQueue()
// ...
// serving content to my client
// ...
go queueSession(session)
呼び出すハンドラである:
session, err := getSessionFromQueue()
defer go queueSession(session)
// ...
// serving content to my client
// ...
私のハンドラは、ある時点でクラッシュ/ハングしていると、セッションが適切に返却されていないことを避けるために、キュー。実行ルーチンとして実行する理由は、queueSession
が潜在的に1秒間ブロックされていることです(キューがいっぱいの場合は、セッションを完全に閉じる前に1秒間待機します)。
更新
@abhinkが右のトラックに私を得ました。私はqueueBackend
のゴルーチンに電話をかけて問題を解決しました。
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)
を呼び出すことができ、それがゴルーチンとして実行されます。
ありがとう、私は正しいトラックに私を入れてください。少し違って実装しましたが、anonymos関数を使うのは非常に良い出発点でした。 – StarSheriff