2010-10-25 15 views
6

मैं रूबी की समानांतर/एसिंक्रोनस प्रोसेसिंग क्षमताओं में देख रहा था और कई लेख और ब्लॉग पोस्ट पढ़ता था। मैं EventMachine, रेशे, Revactor, REIA, आदि, आदि के माध्यम से देखा दुर्भाग्य से, मैं इस बहुत ही सरल उपयोग के मामले के लिए एक सरल, प्रभावी (और गैर आईओ-अवरुद्ध) समाधान खोजने के लिए सक्षम नहीं था:रूबी समवर्ती/एसिंक्रोनस प्रोसेसिंग (सरल उपयोग के मामले के साथ)

File.open('somelogfile.txt') do |file| 
    while line = file.gets  # (R) Read from IO 
    line = process_line(line) # (P) Process the line 
    write_to_db(line)   # (W) Write the output to some IO (DB or file) 
    end 
end 

आप देख सकते हैं मेरी छोटी स्क्रिप्ट तीन आपरेशनों पढ़ें (आर), प्रक्रिया (पी) & लिखने (डब्ल्यू) प्रदर्शन कर रहा है है,। के मान लेते हैं - सादगी के लिए - कि प्रत्येक आपरेशन समय की वास्तव में 1 यूनिट लेता है (उदाहरण के लिए 10ms), वर्तमान कोड इसलिए कुछ इस तरह (5 लाइनों) करना होगा:

Time:  123456789(15 units in total) 
Operations: RPWRPWRPWRPWRPW 

लेकिन, मैं इसे कुछ करना चाहते हैं इस तरह:

Time:  1234567 (7 units in total) 
Operations: RRRRR 
      PPPPP 
       WWWWW 

जाहिर है, मैं तीन प्रक्रियाओं (पाठक, प्रोसेसर & लेखक) चला सकते हैं और पाठक से लाइनों को पढ़ने के पारित प्रोसेसर कतार में और फिर लेखक कतार में संसाधित लाइनों पारित (सभी जैसे RabbitMQ के माध्यम से समन्वित) । लेकिन, उपयोग-मामला इतना आसान है, यह सही नहीं लगता है।

यह कैसे किया जा सकता है इस पर कोई संकेत (रुबी से एरलांग, क्लोजर या स्कैला से स्विच किए बिना)?

+1

क्या लिखना उसी क्रम में कहा जाना चाहिए जैसा उन्हें पढ़ा गया था? –

+0

नहीं, यह पूरी बात है कि वे पूरी तरह से असीमित हो सकते हैं। – Dim

उत्तर

1

आड़ू देखें (http://peach.rubyforge.org/)। एक समानांतर "प्रत्येक" करना आसान नहीं हो सकता है। हालांकि, जैसा कि प्रलेखन कहता है, आपको JVM के मूल थ्रेडिंग का उपयोग करने के लिए JRuby के अंतर्गत चलाने की आवश्यकता होगी।

विभिन्न रूबी दुभाषियों की मल्टीथ्रेडिंग क्षमताओं पर बहुत अधिक जानकारी के लिए this SO question पर जोर्ग मिट्टाग की प्रतिक्रिया देखें।

+0

हम्म, आड़ू वास्तव में वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं समानांतर में आरपीडब्ल्यू नहीं चलाऊंगा, मैं एक दूसरे से 3 कार्य को अलग करना चाहता हूं और उन्हें अतुल्यकालिक रूप से चला सकता हूं। जोर्ग मिट्टाग की प्रतिक्रिया एक महान परिचय देता है। मुझे प्रस्तावित विकल्पों के बारे में अच्छी तरह से पता है, लेकिन उनमें से कोई भी मेरी समस्या का उत्तर नहीं देता है। – Dim

3

यदि आपको वास्तव में समानांतर होने की आवश्यकता है (एक प्रक्रिया से) मुझे विश्वास है कि आपको वास्तविक देशी धागे और कोई जीआईएल प्राप्त करने के लिए जेआरबीई का उपयोग करना होगा।

आप कई प्रक्रियाओं/कोरों में प्रसंस्करण वितरित करने के लिए डीआरबी की तरह कुछ उपयोग कर सकते हैं, लेकिन आपके उपयोग के मामले में यह थोड़ा सा है। इसके बजाय, आप पाइप का उपयोग करके संवाद कई प्रक्रियाओं होने की कोशिश कर सकते:

$ cat somelogfile.txt | ruby ./proc-process | ruby ./proc-store 

इस परिदृश्य में प्रत्येक टुकड़ा अपने स्वयं प्रक्रिया है कि समानांतर में चला सकते हैं लेकिन STDIN/STDOUT का उपयोग कर संवाद कर रहे हैं है। यह शायद आपकी समस्या का सबसे आसान (और सबसे तेज़) दृष्टिकोण है।

# proc-process 
while line = $stdin.gets do 
    # do cpu intensive stuff here 
    $stdout.puts "data to be stored in DB" 
    $stdout.flush # this is important 
end 

# proc-store 
while line = $stdin.gets do 
    write_to_db(line) 
end 
+1

मैंने सोचा कि रूबी 1.9 की जीआईएल आपको एक थ्रेड में सीपीयू सामान करने की अनुमति देती है जबकि एक और धागा I/O करता है - यानी, यह केवल दो थ्रेड को सीपीयू सामान करने पर रोक लगाता है। –

+0

क्या आप फाइबर के बारे में बात कर रहे हैं?फाइबर की मेरी सीमित समझ यह है कि धागे के बजाय प्रत्येक के पास सीपीयू समय की साझा मात्रा होती है, आपका कोड स्पष्ट रूप से फाइबर पर प्रसंस्करण बंद कर देता है जो ब्लॉकिंग आईओ ऑपरेशन को संभाल सकता है और तुरंत कॉलिंग कोड पर वापस आ सकता है। यह आपके द्वारा प्रतीक्षा किए जाने वाले समय की मात्रा को कम करता है, लेकिन मुझे नहीं लगता कि यह आपको प्रति प्रक्रिया एक से अधिक CPU तक फैलाने की अनुमति देगा। मुझे लगता है कि जीआईएल का मतलब है कि निष्पादन का केवल एक धागा किसी भी समय चल सकता है। http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/ – JEH

+2

पाइप का उपयोग करना समस्या को अलग-अलग प्रक्रियाओं में विभाजित करने का एक अच्छा समाधान है, लेकिन यह असीमित नहीं है। यह वास्तव में एक "रूबी वर्कअराउंड" है, इसलिए बड़े आवेदन के दायरे में लागू करना काफी कठिन है। मैंने ऊपर उल्लिखित "समस्या" आईओ संचालित प्रसंस्करण का एक सरल उदाहरण है। मैं यह समझने की कोशिश कर रहा हूं कि रूबी इस क्षेत्र में क्या सक्षम है और इसमें क्या कमी हो सकती है। – Dim

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