2011-01-12 14 views
5

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

क्या किसी को पता है कि ऐसी कार्यक्षमता के साथ एक मणि/प्लगइन है या नहीं? (nanite मुझे बहुत अच्छा लग रहा था, लेकिन लगता है कि यह केवल असीमित है, इसलिए रेल के उदाहरण तब नहीं होंगे जब गणना समाप्त हो जाती है। क्या यह सही है?)
एक और विचार वितरित रूबी (ड्रब) का उपयोग करके अपना खुद का लिखना है, लेकिन अगर यह पहले से मौजूद है तो फिर पहिया का आविष्कार क्यों करें?

किसी भी मदद की सराहना की जाएगी!

संपादित करें: ज़ैयस की युक्तियों के कारण मुझे लगता है कि मैं इसे असंकालिक रूप से करने में सक्षम हूं, इसलिए मैं resque को आजमाने की कोशिश कर रहा हूं।

उत्तर

5

रूबी mutexes/संकेतबाहु है।

आपको यह सुनिश्चित करना केवल एक ही संसाधन गहन प्रक्रिया एक ही समय में हो रहा है बनाने के लिए एक सेमाफोर उपयोग कर सकते हैं।

हालांकि, एक सामने अंत प्रक्रिया अवरुद्ध अन्य कार्यों को समाप्त करते हुए मेरे लिए सही नहीं लगता है के विचार।अगर मैं ऐसा कर रहा था, तो मैं पृष्ठभूमि कार्यकर्ता का उपयोग करता हूं, और फिर प्रगति पर लगातार जांच करने के लिए ताज़ा मेटा टैग के साथ एक पृष्ठ (या एक आईफ्रेम) का उपयोग करता हूं।

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

+0

उस चीज़ metarefresh संभव होगा, लेकिन अगर गणना के बाद ताज़ा मेरी आँखों में भी उपयोगकर्ता के अनुकूल नहीं है पूरा नहीं हुआ है उपयोगकर्ता होने मैन्युअल पृष्ठ पुनः लोड करने के लिए। एटीएम मैं एक ही समय में बहुत से अनुरोधों की उम्मीद नहीं कर रहा हूं, इसलिए वेब थ्रेड को अवरुद्ध करना एक बड़ी चिंता नहीं है। लेकिन आप सही हैं, ऐसा करने का कोई अच्छा तरीका नहीं है। – user573335

+0

आप मेटा रूप में कई बार ताज़ा के रूप में आप चाहते हैं कर सकते हैं - यदि काम पहले ताज़ा करने के बाद पूरा नहीं हुआ है, उन्हें एक ही ताज़ा पेज दिखाने के लिए, और केवल अंतिम पृष्ठ एक बार काम किया है दिखाते हैं। – zaius

+0

ठीक है, मैं इसके बारे में थोड़ा संकोच कर रहा हूँ, लेकिन अधिक मैं इसके बारे में सोचो और अधिक इसे एसिंक्रोनस रूप से ऐसा करने के लिए, कम से कम लंबे समय में बेहतर समाधान लगता है। क्या नौकरी कतारें हैं जिन्हें मैं अपेक्षित कार्य अवधि (वेब ​​थ्रेड से) के बारे में पूछ सकता हूं और यदि वेब पर बहुत अधिक नौकरियां हैं तो कोई त्रुटि संदेश वापस कर सकता है? – user573335

1

आप एक अलग प्रक्रिया है, तो आप एक पृष्ठभूमि काम है ... तो या तो तुम्हारे पास है या नहीं कर सकती ... कर सकते हैं

क्या मैंने किया है वेबसाइट अनुरोध पैरामीटर बारे में है एक डेटाबेस के लिए। फिर daemons मणि का उपयोग कर डेटाबेस में लंबित अनुरोधों की एक अलग प्रक्रिया दिखती है। यह काम करता है और परिणाम डेटाबेस को वापस लिखता है।

वेबसाइट तब तक डेटाबेस को तब तक चुनाव करती है जब तक परिणाम तैयार नहीं होते हैं और फिर उन्हें प्रदर्शित करते हैं।

हालांकि मैं इसे मतदान करने के लिए जावास्क्रिप्ट का उपयोग करता हूं।

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

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

HTH, क्रिस

+0

ठीक है, आप जानते हैं कि मैं कैसे वेब अनुरोध धागा इंतजार पृष्ठभूमि काम खत्म करने के लिए के लिए कर सकते हैं करते हैं? चूंकि वेब रीयूस्ट थ्रेड पृष्ठभूमि थ्रेड को नहीं बढ़ा सकता है, इसलिए मुझे नहीं पता कि यह कैसे करें। – user573335