2014-09-26 4 views
7

मेरे पास एक कतार और एक फ़ंक्शन है जो दोनों को हटाने और enqueueing करता है। मैं यह सुनिश्चित करना चाहता हूं कि जब तक सूची में कुछ न हो, तब तक सही मात्रा में goroutines कतार पर काम करते हैं।सक्रिय goroutines की संख्या को गिनती/प्रदर्शित करें

इस कोड मैं का उपयोग कर रहा है, लेकिन अगर वहाँ वर्तमान में सक्रिय 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 

}  

उत्तर

6

वहाँ runtime.NumGoroutine है, लेकिन आप यह गलत तक पहुंचने वाले हैं की राशि मुद्रण का एक तरीका है मैं सोच रहा था ।

  1. आपके लूप goroutines spawning रखेंगे।
  2. यह लूप के कारण अनावश्यक रूप से सीपीयू चक्र जला देगा।

एक दृष्टिकोण एक 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

धन्यवाद लेकिन प्रतीक्षा करने के लिए है कि कुछ किया जाता है WaitGroup नहीं है? मैं वास्तव में यह सुनिश्चित करना चाहता हूं कि वे कुछ बाहरी कारणों से बहुत जल्दी मर नहीं पाएंगे – meto

+1

@ मेटो गोरौटाइन्स इस तरह "मरने" नहीं करते हैं, अगर कोई गोरौटाइन मर जाता है तो आपका प्रोग्राम सबसे अधिक दुर्घटनाग्रस्त हो जाता है, मैं एक उदाहरण जोड़ूंगा। – OneOfOne

+0

यह बहुत दिलचस्प है। बस एक त्वरित अनुवर्ती सवाल। Wg.Done भाग प्रिंटल के बाद भी रखा जा सकता था, लेकिन निश्चित रूप से अगर सही से पहले, सही? – meto

संबंधित मुद्दे