2017-04-06 3 views
0

Ich möchte wissen, wie Multithread in Ruby und speichern Sie die Ergebnisse der untergeordneten Prozesse in einem Array der übergeordneten.Multiprocesses Ruby und speichern Variablen

Das Array, das ich verarbeiten möchte, hat 400 Elemente.

Ich habe 2 Lösungen ausprobiert.

Solution: 1 (http://www.rubydoc.info/gems/parallel-forkmanager/Parallel/ForkManager) 

require forkmanager 

eng = [] 

array = [{'ip' => 12.34.56,'hostname' => ''}, {'ip' => 22.22.22, 'hostname' => ''} 

pm = Parallel::ForkManager.new(20) 
pm.run_on_finish{|pid, exit_code, return_list| 
    eng << return_list 
} 

array.each do |node| 
    pm.start(node) and wait 
    new_node = process(node) #gives a value to hostname 
    pm.finish(0, new_node) 
end 
pm.wait_all_children 
puts eng #expects it to return new node but it returns node. 




Solution 2: (https://github.com/grosser/parallel) 
require 'parallel' 
eng =[] 
array = [{'ip' => 12.34.56,'hostname' => ''}, {'ip' => 22.22.22, 'hostname' => ''} 
Parallel.map(array, in_processes: 20) do |node| 
    new_node = process(node) #gives a value to hostname 
    eng << new_node 
end 
puts eng #expected to provide nodes. returns empty array instead. 

Antwort

0

Parallel.map funktioniert ähnlich wie Enumerable.map, dass sie die Ergebnisse der Ausführung jedes Blocks auf das angegebene Element in dem Array zurückgibt, und so kann man einfach etwas tun, wie dies die Ergebnisse erhalten der Verarbeitung der einzelnen Knoten:

eng = Parallel.map(array, in_processes: 20) do |node| 
    process(node) # Return the result of processing `node`. `Parallel.map` will return these results for each node in an array 
end 

puts eng # This will have the expected nodes now