2017-04-06 31 views
0

我想知道如何在ruby中多線程並將子進程的結果存儲在父進程的數組中。多進程Ruby和存儲變量

我想處理的數組有400個項目。

我試過2個解決方案。

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. 

回答

0

Parallel.map作品很像Enumerable.map在它返回運行數組中的給定的元素上的每個塊的結果,所以你可以簡單地做這樣的事情得到處理每個節點的結果:

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