2011-11-23 16 views
5

मेरे पास एक ऐसी स्थिति है जहां मैं रुबी में कई इवेंटमैचिन चलाने की इच्छा रखता हूं - क्या किसी के पास इसका अनुभव है? (यदि मैं नहीं करता तो मैं खुद को ऐसा करने के लिए एक टेस्ट केस लिख सकता हूं। ट्यूनेड रहें)।एकाधिक रूबी इवेंट माचिन एक प्रक्रिया में: संभव है?

चलो स्पष्ट हो जाएं: मैं अपने आप को दो धागे को तुरंत चालू करना चाहता हूं, और दोनों धागे में EventMachine.run पर कॉल करना चाहता हूं, इसलिए मेरे पास वास्तव में दो रिएक्टर लूप हैं।

कारण यह है कि मैं एएमक्यूपी मणि के साथ एक एसिंक्रोनस संदेश बस लिख रहा हूं, जो EventMachine का उपयोग करता है। यह ठीक है, लेकिन मैं बनाना चाहते कि एक अलग, मॉड्यूलर घटक है कि दो आवेदन के भीतर इस्तेमाल किया जा सकता:

  • एक अपनी ही अवरुद्ध जीयूआई लूप (कि EventMachine से टिक फोन करके नकली नहीं किया जा सकता है कि - यह वास्तव में ब्लॉक , और यह सी पुस्तकालय में करता है, इसलिए मैं इसे हैक नहीं कर सकता)। यह एक आसान है - बस अपने स्वयं के धागे में ईएम शुरू करें, और आने वाले संदेशों को थ्रू-सुरक्षित तरीके से लूप के बीच साझा करें;
  • और एक अन्य अनुप्रयोग जो स्वयं एक रिएक्टर लूप में चल रहा है, जिसे मैं संभावित रूप से एएमक्यूपी कोड (जो थ्रेड सुरक्षा समस्याओं के लिए अच्छा है) के साथ साझा कर सकता हूं - हालांकि मुझे उपरोक्त ऐप के लिए उन्हें किसी भी तरह से संबोधित करना है)। यह वह है जिसने मुझे सोच लिया ... क्या मैं दो अलग इवेंटमैचिन चलाकर उपरोक्त ऐप के साथ संदेश बस कोड साझा कर सकता हूं?

किसी के पास विचार हैं?

उत्तर

5

ठीक है, ईएम के दस्तावेज़ों में खुदाई, मैं देख EventMachine.run के लिए शरीर इस के साथ शुरू होता:

240:  if reactor_running? 
241:  (b = blk || block) and b.call # next_tick(b) 
242:  else 
     ... start the reactor ... 

यह अद्भुत है। ऐसा लगता है, यदि आप कई धागे में EventMachine.run करते हैं, तो यह दूसरी मशीन की परिभाषा को शेड्यूल करेगा - ब्लॉक "रन" पर पास हो गया है - जो रिएक्टर पहले से चल रहा है।

मुझे इस पुस्तकालय से प्यार है।

2

आपने स्वयं को उत्तर दिया लेकिन मैं टिप्पणियों की भयानक स्टाइल के बिना अपने 2 सेंट जोड़ना चाहता था।

# this will start the eventmachine reactor 
EM::run do 

    # do something 

    # this will do nothing and the block passed to it will 
    # just be executed directly 
    EM::run do 
    # do something else 
    end 

end 
-1

यदि एकाधिक सर्वर एक ही ईएम में चलते हैं, तो शायद कुछ समस्या हो सकती है। शायद आप एक ही ईएम

का उपयोग रद्द करने के लिए कई प्रक्रियाओं में एम शुरू कर सकते हैं
संबंधित मुद्दे