2016-10-06 7 views
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) 

を呼び出すことができ、それがゴルーチンとして実行されます。

答えて

7

ゴルーチンが直接deferにはありません。あなたはこのような何かを試すことができます:

session, err := getSessionFromQueue() 
defer func() { 
    go queueSession(session) 
}() 
+0

ありがとう、私は正しいトラックに私を入れてください。少し違って実装しましたが、anonymos関数を使うのは非常に良い出発点でした。 – StarSheriff

関連する問題