2014-09-26 30 views
7

Tôi có một hàng đợi và một hàm có chức năng khử và khử nước. Tôi muốn chắc chắn rằng số tiền phải của goroutines hoạt động trên hàng đợi, miễn là có cái gì đó trong danh sách.đếm/hiển thị số lượng goroutines đang hoạt động

Đây là mã tôi đang sử dụng, nhưng tôi đã tự hỏi nếu có một cách in ấn số lượng goroutines hiện đang hoạt động

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 

}  

Trả lời

6

runtime.NumGoroutine nhưng bạn đang tiếp cận sai này .

  1. Vòng lặp của bạn sẽ tiếp tục sinh sản goroutines.
  2. điều này sẽ không cần thiết ghi các chu kỳ CPU do vòng lặp for.

Một cách tiếp cận là sử dụng đồng bộ hóa.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

Cảm ơn nhưng không được WaitGroup chờ đợi một điều gì đó được thực hiện? Tôi thực sự muốn chắc chắn rằng họ không chết quá sớm vì một số lý do bên ngoài – meto

+1

@meto Goroutines không "chết" như vậy, nếu một goroutine chết sau đó chương trình của bạn rất có thể bị rơi, tôi sẽ thêm một ví dụ. – OneOfOne

+0

rất thú vị. Chỉ cần một câu hỏi tiếp theo nhanh chóng. Phần wg.Done có thể đã được đặt sau Println, nhưng chắc chắn trước nếu đúng, phải không? – meto

Các vấn đề liên quan