हां, यह जटिल है, लेकिन अंगूठे के नियमों के एक जोड़े हैं जो चीजों को बहुत अधिक सीधा महसूस करना चाहिए।
- उन चैनलों के लिए औपचारिक तर्कों का उपयोग करना पसंद करें, जिन्हें आप वैश्विक दायरे में चैनलों तक पहुँचने के बजाय गो-रूटीन में पास करते हैं। आप इस तरह से अधिक संकलक जाँच कर सकते हैं, और बेहतर प्रतिरूपकता भी।
- एक विशेष गो-रुटीन ('मुख्य' एक सहित) में एक ही चैनल पर पढ़ना और लिखना दोनों से बचें । अन्यथा, गतिरोध एक बहुत बड़ा जोखिम है।
इन दो दिशानिर्देशों को लागू करते हुए, आपके कार्यक्रम का एक वैकल्पिक संस्करण यहां दिया गया है। यह मामला एक चैनल पर कई लेखकों और एक पाठक को प्रदर्शित करता है:
c := make(chan string)
for i := 1; i <= 5; i++ {
go func(i int, co chan<- string) {
for j := 1; j <= 5; j++ {
co <- fmt.Sprintf("hi from %d.%d", i, j)
}
}(i, c)
}
for i := 1; i <= 25; i++ {
fmt.Println(<-c)
}
http://play.golang.org/p/quQn7xePLw
यह एक ही चैनल पर पांच गो-राईटिंग लिखता है, हर एक पाँच बार लिखता है। मुख्य गो-रुटीन सभी पच्चीस संदेशों को पढ़ता है - आप देख सकते हैं कि वे जिस क्रम में दिखाई देते हैं वह अक्सर अनुक्रमिक नहीं होता है (अर्थात सुस्पष्ट स्पष्ट है)।
यह उदाहरण गो चैनलों की एक विशेषता को प्रदर्शित करता है: कई लेखकों को एक चैनल साझा करना संभव है; गो स्वचालित रूप से संदेशों को इंटरलेव करेगा।
एक चैनल पर एक लेखक और कई पाठकों के लिए एक ही लागू होता है, जैसा कि दूसरे उदाहरण में देखा गया है:
c := make(chan int)
var w sync.WaitGroup
w.Add(5)
for i := 1; i <= 5; i++ {
go func(i int, ci <-chan int) {
j := 1
for v := range ci {
time.Sleep(time.Millisecond)
fmt.Printf("%d.%d got %d\n", i, j, v)
j += 1
}
w.Done()
}(i, c)
}
for i := 1; i <= 25; i++ {
c <- i
}
close(c)
w.Wait()
इस दूसरे उदाहरण में मुख्य गोरोइन पर लगाया गया एक प्रतीक्षा शामिल है, जो अन्यथा शीघ्रता से बाहर निकल जाएगी और अन्य पांच गोरोइनों को जल्दी समाप्त करने का कारण बनेगी ( इस सुधार के लिए ओलोव के लिए धन्यवाद ) ।
दोनों उदाहरणों में, किसी भी बफरिंग की आवश्यकता नहीं थी। आमतौर पर केवल प्रदर्शन बढ़ाने वाले के रूप में बफरिंग को देखना एक अच्छा सिद्धांत है। यदि आपका कार्यक्रम बफ़र्स के बिना गतिरोध नहीं करता है , तो यह बफ़र्स के साथ गतिरोध नहीं करेगा (लेकिन इसका रूपांतरण हमेशा सच नहीं होता है)। इसलिए, अंगूठे के एक और नियम के रूप में, बिना बफरिंग शुरू करें, फिर बाद में आवश्यकतानुसार जोड़ें ।
original, hi from 4...