簡體   English   中英

收集Ruby Parallel Gem的結果

[英]Collecting results for Ruby Parallel Gem

Ruby的Parallel gem似乎非常強大,但是我在使用它來構建集合時遇到了麻煩。

將進程設置為0,采用以下示例:

[174] pry(main)> @array = []
=> []
[175] pry(main)> Parallel.each(1..10, :in_processes=>0) {|x| @array.push(Random.rand(10))}
=> 1..10
[176] pry(main)> @array
=> [7, 3, 5, 6, 1, 5, 4, 4, 5, 1]

但是當我們將流程設置為2時:

[177] pry(main)> @array = []
=> []
[178] pry(main)> Parallel.each(1..10, :in_processes=>2) {|x| @array.push(Random.rand(10))}
=> 1..10
[179] pry(main)> @array
=> []

顯然,這甚至沒有接近構建隨機值數組的最佳方法,我想要的是,當有多個進程時,在循環結束后,附加到@array的值不存在。 這是一個范圍問題還是我誤解了叉子是如何工作的?

並行的默認模式通過分支您的流程並在子流程中完成工作(這是IMO,一個巨大的黑客)在幕后工作 子進程不會對父進程的內存具有寫訪問權限; 在孩子中所做的更改不會持久存在於父母身上。

您只能通過gem的工具與您的父流程進行通信,這些工具可以捕獲孩子的返回值。 Parallel.map提供了一種機制,通過該機制,傳入的數據在父節點封送,然后在子節點上解組,處理,然后結果被封送並傳遞回父節點,並收集到結果數組中。 當分叉的孩子死亡時,任何過去的東西都會被“扔掉”。

請考慮使用線程(並正確地同步對共享變量的訪問)。 如果您需要多核並發(即,您正在進行未在IO上阻止的並行工作),您應該考慮JRuby,它沒有GIL並且可以本機地並行執行多個Ruby線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM