2014-09-26 15 views
7

Mam kolejkę i funkcję, która wykonuje zarówno zapisywanie w kolejce jak i zapisywanie. Chcę się upewnić, że odpowiednia ilość goroutinów działa w kolejce, o ile istnieje coś na liście.count/wyświetla liczbę aktywnych goroutines

Jest to kod używam, ale zastanawiałem się, czy istnieje sposób drukowania ilości aktualnie aktywnych goroutines

Link to playground

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 

}  

Odpowiedz

6

Jest runtime.NumGoroutine ale jesteś zbliża to źle .

  1. Twoje pętle pozostaną w goroutines.
  2. spowoduje to niepotrzebne nagrywanie cykli procesora z powodu pętli for.

Jednym ze sposobów jest użycie grupy sync.WaitGroup.

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

Dzięki, ale nie jest WaitGroup czekać, że coś jest zrobione? Naprawdę chcę się upewnić, że nie umrą zbyt wcześnie z jakiegoś zewnętrznego powodu. – meto

+1

@meto Goroutines nie "umierają" w ten sposób, jeśli goroutine zginie, to twój program najprawdopodobniej rozbił się, dodam przykład. – OneOfOne

+0

To bardzo interesujące. To tylko szybkie pytanie uzupełniające. Część wg.Done mogła zostać umieszczona również po Println, ale na pewno przed if, prawda? – meto