2012-09-13 37 views
19

निम्नलिखित सरल जाओ कार्यक्रमफेंक: सभी goroutines सो रहे - गतिरोध

package main 

import (
    "fmt" 
) 

func total(ch chan int) { 
    res := 0 
    for iter := range ch { 
     res += iter 
    } 
    ch <- res 
} 

func main() { 
    ch := make(chan int) 
    go total(ch) 
    ch <- 1 
    ch <- 2 
    ch <- 3 
    fmt.Println("Total is ", <-ch) 
} 

मैं अगर कोई मुझे कारण है कि मैं

throw: all goroutines are asleep - deadlock! 

प्राप्त करने के लिए के रूप में प्रबुद्ध कर सकते हैं सोच रहा हूँ यह देखते हुए आप

उत्तर

30

धन्यवाद चूंकि आप ch चैनल को कभी भी बंद नहीं करते हैं, तो रेंज लूप कभी खत्म नहीं होगा।

आप एक ही चैनल पर परिणाम वापस नहीं भेज सकते हैं। एक समाधान एक अलग उपयोग करने के लिए है।

आपका कार्यक्रम इस तरह अनुकूलित किया जा सकता:

package main 

import (
    "fmt" 
) 

func total(in chan int, out chan int) { 
    res := 0 
    for iter := range in { 
     res += iter 
    } 
    out <- res // sends back the result 
} 

func main() { 
    ch := make(chan int) 
    rch := make(chan int) 
    go total(ch, rch) 
    ch <- 1 
    ch <- 2 
    ch <- 3 
    close (ch) // this will end the loop in the total function 
    result := <- rch // waits for total to give the result 
    fmt.Println("Total is ", result) 
} 
+1

सीधे प्रश्न से संबंधित नहीं है, लेकिन अभी goroutines को समझने के लिए दिलचस्प है: '' के बाद बाहर <यदि आप 'fmt.Println (" कुल बाहर निकल रहा है ") जोड़ - res' आप इसे देख कभी नहीं हो सकता है, goroutines को पूरा करने के इंतजार किए बिना प्रोग्राम जल्द से बाहर निकल सकता है। –

+0

मैंने कुछ दिन पहले सीखना शुरू कर दिया था और मुझे समझ में नहीं आता कि कैसे res res: = 0 केवल एक बार चल रहा है? क्या पूरा कार्य 3 बार चलाने वाला नहीं है? आपके उदाहरण में केवल लूप 3 गुना चल रहा है। – if237912print

+0

@OybekToirov पूरा कार्य केवल एक बार चलता है, प्रत्येक बार 'इन' चैनल –

-3

यह भी सही है।

package main 

import "fmt" 

func main() { 
    c := make(chan int) 
    go do(c) 
    c <- 1 
    c <- 2 
    // close(c) 
    fmt.Println("Total is ", <-c) 
} 

func do(c chan int) { 
    res := 0 
    // for v := range c { 
    // res = res + v 
    // } 
    for i := 0; i < 2; i++ { 
     res += <-c 
    } 
    c <- res 
    fmt.Println("something") 
} 
+3

यह मूल प्रोग्राम के साथ क्या गलत था, इस सवाल का जवाब नहीं देता है। –