2013-05-14 6 views
5

मैं एक मणि लिख रहा हूं, जहां मुझे दो प्रक्रियाओं को फोर्क करना है जो दो वेबब्रिक सर्वर शुरू कर रहे हैं। मैं बेस क्लास से क्लास विधि के माध्यम से इस सर्वर को शुरू करना चाहता हूं, क्योंकि केवल दो सर्वर चल रहे हैं, एकाधिक नहीं। रनटाइम के दौरान, मैं चर बदलने के लिए इन दो सर्वरों पर कुछ विधियों को कॉल करना चाहता हूं।रूबी प्रक्रियाओं के माध्यम से शेयर परिवर्तनीय

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

मैंने कक्षा चर के साथ कोशिश की, जैसे @@server। लेकिन जब मैं बेस क्लास के माध्यम से इस चर को एक्सेस करने का प्रयास करता हूं, तो यह nil है। मैंने पढ़ा है कि रूबी में फोर्क के बीच कक्षा चर साझा करना संभव नहीं है, क्या मैं सही हूँ?

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

+0

[अंतर संचार प्रक्रिया] (http://en.wikipedia.org/wiki/Inter-process_communication) –

+0

बस एक लिंक एक छोटा सा कम है;) मैं इंटर प्रक्रिया संचार पता है, लेकिन करना मुझे वास्तव में एक एक्सएमएल इंटरफ़ेस लागू करना है, या इसे प्राप्त करने के लिए सिस्टम विशिष्ट प्रोटोकॉल से निपटना है? मैंने सोचा, शायद – 23tux

+0

@ 23tux करने के लिए "रूबी-वे" है: रुबी प्रक्रियाएं अलग हैं, आईपीसी आपकी समस्या को हल करने का एकमात्र तरीका है (शीर्ष स्तर पर)। बहुत सारे रूबी रत्न हैं जो यद्यपि मदद कर सकते हैं। आप शायद डिस्क पर अपने डेटा को 'मार्शल' कर सकते हैं - आपको केवल कुछ लॉकिंग (आंशिक पढ़ने/लिखने से बचने के लिए) जोड़ने की आवश्यकता होगी, और प्रदर्शन पर नजर रखें। डिस्क को छूने से बचने के लिए अगला अप स्थानीय 'memcached' पर marshalling हो सकता है। । । –

उत्तर

8

जब आप किसी प्रक्रिया को फोर्क करते हैं तो बच्चे और अभिभावक प्रक्रियाओं की स्मृति अलग हो जाती है, इसलिए आप सीधे उनके बीच चर साझा नहीं कर सकते हैं। तो एक सिंगलटन कक्षा आपके मामले में काम नहीं करेगी।

समाधान IPC है, रूबी दोनों pipes और sockets, का समर्थन करता है जो दो भारतीय दंड संहिता की सबसे अधिक इस्तेमाल किया रूपों, कम से कम * NIX पर हैं। यदि आपको अधिक पारदर्शी इंटरफ़ेस की आवश्यकता है, तो रूबी distributed objects का भी समर्थन करता है।

आपने जो चुना है वह नौकरी पर निर्भर करता है। यदि आप जानते हैं कि आप किसी बिंदु पर कई कंप्यूटरों पर प्रक्रियाओं को विभाजित करना चाहते हैं, तो सॉकेट या ड्रब के साथ जाएं। यदि पाइप के साथ नहीं जाते हैं।

Here's a short introduction to pipes in Ruby

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