2010-10-01 14 views
7

मेरे पास एक ऐसा प्रोग्राम है जो एक बार में 10000 धागे बनाता है, और एक ही समय में 8 चलाता है।रुबी के पास थ्रेडपूल अंतर्निहित क्यों नहीं है?

लेकिन रूबी में जावा के रूप में अंतर्निहित थ्रेडपूल नहीं है। क्या कोई अच्छा कारण है?

+0

हाँ मैं जावा के एक्जिक्यूटर्स सेवा के समान कुछ सोच रहा था। – JohnMerlino

उत्तर

2

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

+2

भले ही YARV (रूबी 1.9) एक समय में केवल एक सीपीयू का उपयोग करता है, मुझे नहीं लगता कि यह हरे धागे का उपयोग करता है। –

+3

ग्रीन थ्रेड थ्रेड पूल बेकार नहीं बनाते हैं। एक धागा प्रोग्राम के बाहर कुछ बाहरी इंतजार कर रहा है, जिसके दौरान एक और धागा निर्धारित किया जा सकता है। अनुक्रमिक प्रसंस्करण की तुलना में हरे धागे का उपयोग अक्सर (आमतौर पर?) अधिक कुशल होता है। – Kelvin

20

शायद इसलिए कि मानक लाइब्रेरी "कतार" कक्षा का उपयोग करके अपना खुद का रोल करना आसान है।

q = Queue.new 
3.times { Thread.new { while something = q.pop(true) rescue nil; ... } 

हालांकि यह एक अच्छा सवाल है - मैं इसे रूबी कोर के साथ लाने का सुझाव दे सकता हूं।

+0

क्या आपको कोई प्रतिक्रिया मिली? –

+2

मुझे अभी भी याद नहीं है अगर मैंने अभी पूछा ... – rogerdpack

3

मेरा संदेह ऐसा होगा क्योंकि थ्रेडपूल रूबी के सी-आधारित कार्यान्वयन में उपयोगी नहीं होगा। आप एक समय में केवल एक प्रोसेसर का उपयोग कर सकते हैं मैट्स रूबी इंटेप्रेटर या फिर एक और रूबी वीएम के साथ।

यदि आप एकाधिक प्रोसेसर पर एकाधिक थ्रेड चलाने के लिए चाहते हैं, तो आपको इसके बजाय JRuby का उपयोग करना होगा।

+0

बिल्कुल। थ्रेड पूल, हरे धागे, व्यर्थ। – Joshua

+14

निश्चित रूप से व्यर्थ नहीं है अगर आपको कुछ अवरुद्ध आईओ मिल गया है? –

+0

@ एंडी अच्छा बिंदु। –

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