18

मैं समय-समय पर रुबी के साथ हैकिंग कर रहा हूं, लेकिन मैंने इसके साथ कुछ भी बड़ा या बहुसंख्यक नहीं किया है। मैंने सुना है कि एमआरआई केवल हरे धागे का समर्थन करता है और जेआरबीबी जेवीएम के माध्यम से मूल धागे का समर्थन करता है। हालांकि, मैं ब्लॉग और चर्चा समूहों पर टिप्पणियों पर ठोकर खाता हूं जो कहता है कि "रेल थ्रेड-सुरक्षित नहीं है" या रूबी स्वयं धागा सुरक्षित नहीं है। उदाहरण के लिए किसी ने टिप्पणी की कि आवश्यकता कथन के साथ एक समस्या है। यह थोड़ा मौलिक लगता है।रूबी/रेल थ्रेड सुरक्षा

मैं जावा क्षुधा जो संगामिति ठीक से संभाल नहीं है की एक बहुत कुछ देखा है और मैं समय-समय :-) करने के लिए लेकिन आप कम से कम कर सकते हैं जावा में लिखने धागा सुरक्षित अनुप्रयोगों यदि आप वास्तव में उनके बारे में बुरे सपने पता है कि आप क्या कर रहे हैं (यह बस आसान नहीं है)।

यह सब काफी खतरनाक लगता है, क्या कोई और विस्तार से बता सकता है - वास्तव में समस्या क्या है और रेल इस मामले में कैसे काम करता है? क्या मैं मल्टीथ्रेडेड रूबी कोड लिख सकता हूं जो दौड़ की स्थिति और डेडलॉक्स के बिना सही तरीके से काम करता है? क्या यह जेआरबी और एमआरआई के बीच पोर्टेबल है या क्या मुझे JVM देशी थ्रेड का लाभ उठाने के लिए जेवीएम विशिष्ट कोड में हैक करना है?

संपादित करें:

मैं दो प्रश्न पूछे जाना चाहिए था, क्योंकि लोगों को केवल रेल सामान (जो अपने आप में अच्छा है) और हरी सूत्रण सूत्रण देशी सूत्रण बनाम जवाब देने के लिए लग रहे हैं। थ्रेड सुरक्षा के बारे में मूल रूबी मुद्दों पर मेरी चिंताओं को वास्तव में संबोधित नहीं किया गया है। कुछ मामलों में कम से कम एक (अनसुलझा?) issue लगता है।

+0

डुप्लिकेट: http://stackoverflow.com/questions/129226/what-are-the-current-state-of-affairs-on-threading-concurrency-and-forked-proces/129331#129331 –

उत्तर

5

एमआरआई के लिए सामान्य समाधान कई रेल उदाहरणों को चलाने के लिए है, प्रत्येक हैंडलिंग अनुरोध स्वतंत्र रूप से। चूंकि एमआरआई किसी भी तरह से बहुप्रचारित नहीं है, इसलिए आप इसके ऊपर कई रेल उदाहरण नहीं चला सकते हैं। इसका मतलब है कि आप मेमोरी हिट लेते हैं क्योंकि प्रति रूबी प्रक्रिया के बाद रेल लोड हो जाती है।

चूंकि जेआरबीई देशी धागे का समर्थन करता है, इसलिए आप हमेशा एक एकल जेवीएम में कई रेल उदाहरण चला सकते हैं। लेकिन रेल थ्रेड-सुरक्षित होने के साथ, आप इसे एक तक काट सकते हैं, जिसका अर्थ है कम स्मृति उपयोग और कम जेआईटी संकलन।

चार्ल्स न्यूटर (जेआरबीई) में nice summary है।

+0

धन्यवाद, चार्ल्स नटर का सारांश बहुत अच्छा है। – auramo

1

मुझे लगता है कि पिछले पोस्टर ने रेल मामलों को बहुत अच्छी तरह से कवर किया था, इसलिए मैं उस तरह की चीजों में जाने से परेशान नहीं होगा।

थ्रेड वाले रूबी अनुप्रयोगों को लिखना निश्चित रूप से संभव है। रूबी धागे के साथ मौजूद कुछ समस्या यह है कि वे 'हरे' हैं क्योंकि वे वर्चुअल मशीन द्वारा प्रबंधित होते हैं। वर्तमान में, डिफ़ॉल्ट दुभाषिया (एमआरआई) में केवल एक सच्चा सिस्टम थ्रेड है जिसे दुभाषिया पर नियंत्रण रखने वाले सभी थ्रेडों द्वारा साझा करने की आवश्यकता है।

इसका नकारात्मक पक्ष यह है कि यदि आपके पास एकाधिक प्रोसेसर या कोर वाले कंप्यूटर हैं तो आपके पास किसी अन्य कोर पर चलने वाले एप्लिकेशन में कोई थ्रेड नहीं हो सकता है। सर्वर और उच्च प्रदर्शन ऐप्स चलाने वाले लोगों के लिए यह एक बहुत बड़ा सौदा है।

आपके दुभाषिया-विशिष्ट-कोड प्रश्न के लिए: मुझे ऐसा नहीं लगता है। AFAIK आपको JRuby/JVM थ्रेड की देखभाल करने के लिए कुछ भी विशेष करने की ज़रूरत नहीं है।

इसके अलावा: This article इग्विटा पर जो रूबी में समेकन की स्थिति पर एक अच्छा नज़र डालें।

14

सबसे पहले और सबसे प्रमुख, रुबी 1.9 (सबसे हालिया आधिकारिक रिलीज) now uses native (kernel) threads। रूबी के पिछले संस्करणों ने हरे धागे का इस्तेमाल किया। संक्षेप में आपके प्रश्न का उत्तर देने के लिए, 1.9 से पहले, आमतौर पर रूबी अनुप्रयोगों में धागे का उपयोग बड़े या छोटे से नहीं किया जाता है क्योंकि वे विशेष रूप से सुरक्षित या भरोसेमंद नहीं होते हैं।

यह विशेष रूप से खतरनाक नहीं है क्योंकि संस्करण 2.2 से पहले रेलों ने थ्रेडसेफ होने का कोई प्रयास नहीं किया है, और इसलिए हम आमतौर पर एकाधिक प्रक्रियाओं, डेटाबेस रिकॉर्ड लॉकिंग और Starling जैसे संदेश कतारों के उपयोग के माध्यम से एसिंक्रोनस प्रोसेसिंग को संभालते हैं। यह आम तौर पर एक वेब अनुप्रयोग को स्केल करने का एक बहुत ही विश्वसनीय तरीका है - कम से कम गलत तरीके से मल्टीथ्रेड किए गए जावा अनुप्रयोगों से विश्वसनीय के रूप में - और इसमें अतिरिक्त लाभ है कि एकाधिक प्रोसेसर और सर्वर पर आपके एप्लिकेशन के किनारे को स्केल करना आसान हो जाता है।

मुझे नहीं पता कि आपके द्वारा उल्लिखित 'आवश्यकता' समस्या को 1.9 के रूप में हल किया गया है, लेकिन मैं विनम्रतापूर्वक उद्यम करता हूं कि यदि आपको नए धागे में गतिशील रूप से पुस्तकालयों की आवश्यकता होती है तो आपके पास एक से अधिक रखरखाव समस्या है।

यदि आप पूरी तरह से धागे से बचना चाहते हैं, रूबी 1.9 also supports fibers, जो समेकन के लिए साझा-साझा दृष्टिकोण को नियोजित करता है और जो मैं इकट्ठा करता हूं, आम तौर पर धागे की तुलना में लिखना और बनाए रखना आसान होता है। Performance numbers here

+0

* * * * * गलत तरीके से * बहुप्रचारित जावा अनुप्रयोगों "की तुलना करने के लिए उपयोगी क्यों है? –

+0

@ किर्कवॉल मेरा पढ़ना था कि उत्तर देने वाला यह कह रहा था कि "जब किसी भाषा में थ्रेडिंग खतरनाक होती है, तो वह उस भाषा में इसके लायक नहीं हो सकती है।" – Jackson