2016-07-04 21 views
2

Ich versuche herauszufinden, wie man RethinkDB changesfeeds mit Golang verwendet. Meine spezifische Frage ist, wie man eine Goroutine stoppt, die auf Änderungen an der Datenbank hört. Siehe zum Beispiel die Funktion getData() unten. Ich führe dies von einem Handler Funktion durch Aufruf go getData(c). Wenn die Datenbank aktualisiert wird, wird der Datensatz an den Kanal c übergeben, der dann an die Handler-Funktion übergeben und mit SSE-Technologie an den Client gesendet wird. Meine Frage ist: Wenn der Client trennt, kann ich die Handler-Funktion stoppen und beenden; Allerdings läuft die Goroutine, die die getData()-Funktion ausführt, weiter. Was kann ich tun, um es zu schließen? Eine Lösung, die ich mir basierend auf anderen Antworten auf stackoverflow vorstellen kann, ist ein Signal zu senden, um die Goroutine auf einem anderen Kanal zu schließen und eine select-Anweisung zu verwenden, um dieses -Signal zu behandeln. So kann beispielsweise IWie kann man eine Goroutine stoppen, die auf RethinkDB-Wechselfeeds hört?

for cur.Next(&rec) { 
     c <- rec 
    } 

in der Funktionsdefinition ersetzen unten mit:

for cur.Next(&rec) { 
     select { 
     case <- closesignal: 
      return 
     default: 
      c <- rec 
     } 
    } 

wo closesignal ist ein weiterer Kanal, der als drittes Argument getData() und eine Nachricht auf dieser gesendet wird, gegeben wird, Kanal durch den Handler, wenn der Client die Verbindung trennt. Das Problem mit diesem Ansatz ist: Was passiert, wenn das Ergebnis der spezifischen rethinkdb-Abfrage nie aktualisiert wird. In diesem Fall wird die for cur.Next(&rec)-Schleife nicht eingegeben und die closesignal wird nicht verwendet. Würde diese Goroutine dann weiterlaufen? Wenn ja, wie höre ich diese Goroutine auf?

Die getData() Funktion

func getData(session *r.Session, c chan interface{}) { 
    var rec interface{} 

    changesOpts := r.ChangesOpts{ 
     IncludeInitial: true, 
    } 

    cur, err := r.DB(DBNAME).Table("test").Changes(changesOpts).Run(session) 
    if err != nil { 
     log.Println(err) 
     return 
    } 
    defer cur.Close() 

    defer func() { 
     fmt.Println("exiting getData goroutine()...") 
    }() 


    for cur.Next(&rec) { 
     c <- rec 
    } 

} 

Antwort

1

Sie können eine goroutine stoppen, die durch Schließen Sie den Cursor auf einem changefeed hört. Zum Beispiel wird dieser Code vor dem Schließen 10 Sekunden lang auf einen Wechsel warten:

+0

Vielen Dank! Ja, das hilft. Bist du derselbe Daniel Cannon, der Gorethink geschrieben hat? Wenn ja, danke eine Tonne. Es ist eine wunderbare Bibliothek. – Curious2learn

+0

Großartig, froh, dass es jetzt funktioniert :) (und ja, ich habe GoRethink geschrieben Danke! Wenn Sie noch weitere Fragen haben, können Sie sich gerne an den RethinkDB Slack wenden) –