2009-11-11 20 views
8

मैं समझता हूं कि goroutines एकाधिक ओएस धागे पर मल्टीप्लेक्ड हैं, इसलिए अगर किसी को ब्लॉक करना चाहिए, जैसे I/O की प्रतीक्षा करते समय, अन्य चलते रहेंगे। लेकिन क्या समय से पहले यह जानने का कोई तरीका है कि अगर मैं एन गोरोटाइन बनाना चाहता हूं तो कितने धागे पैदा होंगे?क्या आप पता लगा सकते हैं कि दिए गए संख्या में गोरौटाइन कितने धागे बनाएंगे?

उदाहरण के लिए, अगर हम फोन नीचे समारोह हम जानते हैं कि कितने (या की अधिकतम संख्या) प्रणाली धागे n goroutines के लिए बनाया जा जाएगा:

type Vector []float64 

// Apply the operation to n elements of v starting at i. 
func (v Vector) DoSome(i, n int, u Vector, c chan int) { 
    for ; i < n; i++ { 
     v[i] += u.Op(v[i]) 
    } 
    c <- 1; // signal that this piece is done 
} 
+1

+1 केवल दो प्रासंगिक (गैर-गपशप, गैर-गी-व्हिज) में से एक के लिए +1 अब तक –

+1

यह लूप के लिए है। यह समरूपता भी व्यक्त नहीं करता है, बहुत कम समांतरता। – Dustin

उत्तर

7

पाईक जाओ कोर्स पीडीएफ स्लाइड (3 दिन) के अनुसार:

... यदि आप उपयोगकर्ता के स्तर समानांतरवाद चाहते आप $GOMAXPROCS सेट या runtime.GOMAXPROCS(n) कॉल करना होगा। GOMAXPROCS रनटाइम शेड्यूलर को बताता है कि कितने गैर-सिस्कल-अवरुद्ध goroutines एक साथ चलने के लिए।

पर this blog post आधार पर, भी, यह वातावरण चर GOMAXPROCS आप धागे की संख्या तय की सुविधा देता है की स्थापना प्रतीत होता है। मुझे यकीन नहीं है कि यदि आप इस मान को निर्दिष्ट नहीं करते हैं, तो रनटाइम प्रबंधित होने वाले थ्रेड की डिफ़ॉल्ट संख्या कैसे प्राप्त करेंगी।

This blog post सूचित करते हैं कि आप वातावरण चर सेट नहीं करते क्रम केवल एक कोर का उपयोग करेंगे लगता है (शायद क्योंकि यह केवल एक प्रक्रिया का उपयोग कर रहा है।)

+4

सुधार (spec से उद्धरण): "GOMAXPROCS अधिकतम CPUs सेट करता है जो एक साथ निष्पादित किया जा सकता है और पिछली सेटिंग देता है।" यदि एन goroutines एन सिस्टम कॉल में फंस गए हैं (जो एन धागे की आवश्यकता है), गो हमेशा प्रतीक्षा goroutines reschedule करने के लिए एक एन + 1 थ्रेड होगा। Http://code.google.com/p/go/issues/detail भी देखें?id = 1644 –

3

वर्तमान में, gccgo goroutine प्रति एक धागा पैदा करेगा ।

मुझे 6 जी के बारे में पता नहीं है।

6

प्रत्येक goroutine एक पर एक धागा की एक अधिकतम उपयोग कर सकते हैं पहर। चाहे वह धागे का उपयोग करता है या नहीं, यह इस बात पर निर्भर करता है कि यह क्या कर रहा है। GOMAXPROCS का मान थ्रेड की संख्या निर्धारित करता है जिसे मुक्त रूप से चलने वाले कोड द्वारा उपयोग किया जा सकता है - दूसरे शब्दों में, समांतरता का अधिकतम स्तर।

हालांकि अधिक सूत्र, इस्तेमाल किया जा सकता भी GOMAXPROCS = 1, जब goroutines सिस्टम कॉल पर सीधे ब्लॉक या कॉल सी में

निम्न कार्रवाई करते नहीं goroutine कारण एक धागा जब वे ब्लॉक का उपयोग करने के साथ :

  • चैनल संचालन
  • नेटवर्क संचालन
  • सभी
  • सो sync पैकेज

इसका मतलब यह है में पुरातन, उदाहरण के लिए, यदि आप कई goroutines कि खोलने/dev/ttyxx और ब्लॉक पढ़ने पर है, तो आप हर एक के लिए एक धागा का उपयोग किया जाएगा कि। वही होता है यदि आप प्रक्रियाओं का एक भार निष्पादित कर रहे हैं और बाहर निकलने के लिए प्रतीक्षा कर रहे हैं।

+0

/dev/ttyxx पर अवरुद्ध करने के संबंध में, दिमित्री Vyukov मेलिंग सूची में कहा: "कोई कारण नहीं है कि हम" हुड के तहत गैर-अवरुद्ध "नहीं कर सकते हैं" फाइलों/उपकरणों/आदि के हैंडलिंग। यह अभी नहीं किया गया है अभी तक। विंडोज़ पर आईओसीपी के साथ यह आसान है, नॉनब्लॉकिंग नेटवर्क और फाइल ऑपरेशंस एक जैसे हैं। मुझे यकीन नहीं है कि आज यूनिक्स पर एआईओ की स्थिति क्या है। " https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ –

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