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.
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