2016-10-06 5 views
3

Gibt es eine Möglichkeit, eine Go-Routine zu verschieben, oder eine Möglichkeit, das gewünschte Verhalten zu erreichen? Der folgende Hintergrund: Ich bündle Verbindungen zu einer Datenbank in einem Kanal. Im Grunde genommen in einem Handler nenne ichIst es möglich, eine Goroutine zu verschieben?

session, err := getSessionFromQueue() 
// ... 
// serving content to my client 
// ... 
go queueSession(session) 

Was ich wirklich tun möchte ist:

session, err := getSessionFromQueue() 
defer go queueSession(session) 
// ... 
// serving content to my client 
// ... 

zu vermeiden, dass mein Handler hängt/irgendwann abstürzt und die Sitzung nicht ordnungsgemäß an das zurück Warteschlange. Der Grund, warum ich es als eine Go-Routine ausführen möchte, ist, dass queueSession potenziell für 1 Sekunde blockiert (im Falle, dass die Warteschlange voll ist, warte ich eine Sekunde, bevor ich die Sitzung vollständig schließe).

aktualisieren

@abhink hat mich auf dem richtigen Weg gibt. Ich löste das Problem, indem ich den Aufruf einer goroutine in queueBackend setzte.

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) 
} 

Jetzt können nenne ich einfach

defer queueSession(session) 

und es wird als goroutine laufen.

Antwort

7

Es gibt keine Möglichkeit, direkt eine defer eine Goroutine. Sie können versuchen, etwas wie folgt:

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

danke, das brachte mich auf den richtigen Weg. Ich habe es etwas anders implementiert, aber die Verwendung einer Anonymisierungsfunktion war ein sehr guter Ausgangspunkt. – StarSheriff

Verwandte Themen