2014-09-26 21 views
7

Ich habe eine Warteschlange und eine Funktion, die sowohl die Warteschlange als auch die Warteschlange entfernt. Ich möchte sicherstellen, dass die richtige Menge an Goroutinen in der Warteschlange operiert, solange etwas in der Liste ist.Anzahl/Anzeige der Anzahl der aktiven Goroutinen

Dies ist der Code, den ich verwende, aber ich habe mich gefragt, ob es einen Weg

Link to playground

des Druckens der Menge der aktuell aktiven goroutines ist
var element int 

func deen(queue chan int) { 

    element := <-queue 
    fmt.Println("element is ", element) 
    if element%2 == 0 { 
     fmt.Println("new element is ", element) 
     queue <- (element*100 + 11) 
     queue <- (element*100 + 33) 
    } 
} 

func main() { 
    queue := make(chan int, 10) 
    queue <- 1 
    queue <- 2 
    queue <- 3 
    queue <- 0 
    for len(queue) != 0 { 
     for i := 0; i < 2; i++ { 
      go deen(queue) 
     } 
    } 
    fmt.Scanln() 
    fmt.Println("list is has len", len(queue)) //this must be 0 

}  

Antwort

6

Es gibt runtime.NumGoroutine aber Sie diese falsch sind nähern .

  1. Ihre Loops werden weiterhin Gatoruins hervorbringen.
  2. Dies wird unnötigerweise CPU-Zyklen wegen der for-Schleife brennen.

Ein Ansatz besteht darin, eine sync.WaitGroup zu verwenden.

func deen(wg *sync.WaitGroup, queue chan int) { 
    for element := range queue { 
     wg.Done() 
     fmt.Println("element is ", element) 
     if element%2 == 0 { 
      fmt.Println("new element is ", element) 
      wg.Add(2) 
      queue <- (element*100 + 11) 
      queue <- (element*100 + 33) 
     } 
    } 
} 

func main() { 
    var wg sync.WaitGroup 
    queue := make(chan int, 10) 
    queue <- 1 
    queue <- 2 
    queue <- 3 
    queue <- 0 
    for i := 0; i < 4; i++ { 
     wg.Add(1) 
     go deen(&wg, queue) 
    } 
    wg.Wait() 
    close(queue) 
    fmt.Println("list is has len", len(queue)) //this must be 0 
} 

playground

+0

Dank aber WaitGroup ist nicht zu warten, dass etwas getan wird? Ich möchte wirklich sicherstellen, dass sie nicht aus irgendeinem äußeren Grund zu früh sterben – meto

+1

@meto Goroutines nicht "sterben" so, wenn eine Goroutine stirbt dann Ihr Programm höchstwahrscheinlich abgestürzt ist, werde ich ein Beispiel hinzufügen. – OneOfOne

+0

das ist sehr interessant. Nur eine kurze Folgefrage. Der wg.Done Teil könnte auch nach dem Println platziert worden sein, aber sicher vor dem if, oder? – meto

Verwandte Themen