2010-06-16 6 views
9

मेरे पास एक रूबी प्रोग्राम है जो दो बहुत बड़ी याम फाइलों को लोड करता है, इसलिए मैं कुछ प्रक्रियाओं को बंद कर कई कोरों का लाभ उठाकर कुछ गति प्राप्त कर सकता हूं। मैंने देखने की कोशिश की है, लेकिन मुझे यह समझने में परेशानी हो रही है कि कैसे, या यहां तक ​​कि यदि मैं विभिन्न प्रक्रियाओं में चर साझा कर सकता हूं।रूबी प्रक्रियाओं के बीच साझा परिवर्तनीय

@proteins = "" 
@decoyProteins = "" 

fork do 
    @proteins = YAML.load_file(database) 
    exit 
end 

fork do 
    @decoyProteins = YAML.load_file(database) 
    exit 
end 

p @proteins["LVDK"] 

P प्रदर्शित करता है, हालांकि कांटा के कारण शून्य:

निम्नलिखित कोड मैं वर्तमान में क्या है।

तो क्या फोर्क प्रक्रियाएं चर को साझा करना संभव है? और यदि हां, तो कैसे?

+0

आप यकीन है कि यह YAML कि समय देने के लिए है रहे हैं? यदि हां, तो क्या आपने इसे सिक की बजाय मन के साथ लोड करने का प्रयास किया है? –

उत्तर

13

एक समस्या यह है कि आपको अपनी फोर्क प्रक्रियाओं को पूरा करने के लिए Process.wait का उपयोग करने की आवश्यकता है। दूसरा यह है कि आप चर के माध्यम से इंटरप्रोसेस संचार नहीं कर सकते हैं। इस देखने के लिए:

@one = nil 
@two = nil 
@hash = {} 
pidA = fork do 
    sleep 1 
    @one = 1 
    @hash[:one] = 1 
    p [:one, @one, :hash, @hash] #=> [ :one, 1, :hash, { :one => 1 } ] 
end 
pidB = fork do 
    sleep 2 
    @two = 2 
    @hash[:two] = 2 
    p [:two, @two, :hash, @hash] #=> [ :two, 2, :hash, { :two => 2 } ] 
end 
Process.wait(pidB) 
Process.wait(pidA) 
p [:one, @one, :two, @two, :hash, @hash] #=> [ :one, nil, :two, nil, :hash, {} ] 

एक तरह से इंटरप्रोसेस संवाद करने के लिए एक पाइप (IO::pipe) का उपयोग कर रहा है। इसे फोर्क से पहले खोलें, फिर कांटा के प्रत्येक तरफ पाइप के एक छोर को बंद करें।

ri IO::pipe से:

rd, wr = IO.pipe 

    if fork 
     wr.close 
     puts "Parent got: <#{rd.read}>" 
     rd.close 
     Process.wait 
    else 
     rd.close 
     puts "Sending message to parent" 
     wr.write "Hi Dad" 
     wr.close 
    end 

_produces:_ 

    Sending message to parent 
    Parent got: <Hi Dad> 

आप चर, उपयोग धागे साझा करना चाहते हैं:

@one = nil 
@two = nil 
@hash = {} 
threadA = Thread.fork do 
    sleep 1 
    @one = 1 
    @hash[:one] = 1 
    p [:one, @one, :hash, @hash] #=> [ :one, 1, :hash, { :one => 1 } ] # (usually) 
end 
threadB = Thread.fork do 
    sleep 2 
    @two = 2 
    @hash[:two] = 2 
    p [:two, @two, :hash, @hash] #=> [ :two, 2, :hash, { :one => 1, :two => 2 } ] # (usually) 
end 
threadA.join 
threadB.join 
p [:one, @one, :two, @two, :hash, @hash] #=> [ :one, 1, :two, 2, :hash, { :one => 1, :two => 2 } ] 

हालांकि, मैं अगर सूत्रण जब आप आईओ रहे आप किसी भी लाभ मिल जाएगा यकीन नहीं है बाध्य।

+0

'कहां है: hash' प्रतीक जाना, जब आप' लिखने p [: एक, @one,: हैश, @hash] # => [: एक, 1, {: एक => 1}] '? – Jeriko

+0

... खराब प्रतिलेखन के कारण अदृश्य? :) इसे ठीक किया गया, thx – rampion

+0

मैं प्रक्रिया के बीच डेटा कैसे साझा करूं जो रेल प्रारंभकर्ताओं और एक प्रक्रिया जो HTTP अनुरोध चलाता है? उनमें से सभी फ्यूजन पैसेंजर द्वारा मेरे हस्तक्षेप के बिना पैदा हुए हैं। – Paul

0

यह प्रक्रियाओं के बीच चर साझा करने के लिए संभव है; ड्रूबी शायद ऐसा करने के लिए सबसे कम अवरोध-से-प्रवेश तरीका है।

+0

डॉक: http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/drb/rdoc/classes/DRb.html – rampion

0

आप शायद यदि आप डेटा साझा करना चाहते हैं एक धागा बजाय एक कांटा का उपयोग करना चाहते हैं।

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html

ओह, और यदि आप वास्तव में धागे की लाभ लेना चाहते हैं आप JRuby का उपयोग करना चाहेंगे। [सी] रूबी 1.9 में आप हमेशा फाइबर पर एक नज़र रखना चाहते हैं। मैंने उन पर ध्यान नहीं दिया है, मुझे नहीं पता कि यह आपके लिए एक समाधान है या नहीं।

+1

धागे नहीं कर रहे हैं कि मैं क्या चाहते हैं, क्योंकि यदि ऐसा नहीं होता कई कोर का लाभ लेने के। मैं वास्तव में धागे को पहले से ही करने की कोशिश की है, और यह वास्तव में धीमी थी। –

1

Cod अंतर प्रक्रिया संचार के लिए है और आपको आसानी से फोर्क प्रक्रियाओं के बीच डेटा भेजने की अनुमति देगा।