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