2017-08-18 4 views
0

Ich habe zwei Routine-Funktionen zu gehen, erstellt man Daten und man fügt die Daten in die Datenbank. Wenn ich mit dem Erstellen der Daten fertig bin, möchte ich das Hinzufügen von Daten beenden, aber ich weiß nicht, wie oft ich die Funktion aufrufen werde.Exit-Programm, wenn alle Goroutinen fertig sind

for { 
    select { 
    case c <- dataChan: 
    go func() { 
     if data == false { 
     return // keeps the program running but never exits 
     } 
     createData(c.Data) // sends data to dataChan until data == false 
    } 
    go func() { 
     addData(c.Data) // need to keep the program running until all these goroutines finish 
    } 
    } 
} 

createData() erstellt und sendet Daten an die dataChan und basiert auf einigen Variablen es schließlich data zu false gesetzt wird und das Programm dazu führen, offen gehalten werden, indem man immer und immer wieder zurückkehren und hält mehr Daten zu schaffen, aber ich fühle mich wie sollte es einen saubereren Weg geben, der es mir erlaubt, zu beenden, wenn alle addData() Göroutinen fertig sind. Ich habe gesehen, dass Leute einen Kanal dafür benutzen, aber ich weiß nicht genau, wie oft ich die Funktion aufrufen werde.

UPDATE: ARBEITS CODE

var wg sync.WaitGroup 
for { 
    select { 
    case c <- dataChan: 
    wg.Add(1) 
    go func() { 
     if data == false { 
     wg.Wait() 
     os.Exit(0) 
     } 
     createData(c.Data) 
    } 
    go func() { 
     addData(c.Data) 
     defer wg.Done() 
    } 
    } 
} 

Antwort

5

sync.WaitGroup ist, was Sie hier wollen. Sie wg.Add(1) vor dem Start jeder goroutine (oder wg.Add(n), wenn Sie wissen, die Zählung vorne), wg.Done() in jeder Routine, wenn Sie fertig sind, und wg.Wait() in main warten, bis alle beenden. Die verlinkten Dokumente haben ein Beispiel, und wie die Notiz der Dokumentation zeigt, wird das Kopieren nicht das machen, was Sie wollen; Vielleicht möchten Sie die Variable zu einem Zeiger machen().

Verwandte Themen