RubyのParallelで、プロセス間で変数を共有したいと考えています。
(全体での試行回数をカウントしたい)
in_threadsの場合は変数を共有できるのですが、in_processesの場合はうまく共有できません。
(プロセスごとに独立してカウントされてしまいます)
◆コード
ruby
1require 'parallel' 2 3$i = 0 4result = Parallel.map([1,2,3,4,5,6,7,8,9,10], in_processes: 5) do |n| 5 p $i+=1 6end 7
出力結果
1 1 2 2 1 1 3 1 3 2
in_processesをin_threadsとすれば
1 2 3 6 8 10 7 5 9 4
プロセスとスレッドの違いが詳しく理解できていないのですが、おおまかに
「プロセスは、分離していて、変数共有が難しく、処理が速い」
「スレッドは、共有されていて、お互いに作用しないようにプログラムに工夫が必要であったり、処理が遅い」
ということが大まかに理解しています。
(重たい処理をさせるとやはり数倍の速度差が出てきました)
◆プロセスとスレッドについて
https://qiita.com/masashi127/items/b186bbf20b4c9632cc86
◆並列時には変数のロックが必要
また、スレッドの場合は、変数を同時に使用してしまうことを避けるためにロックが必要というようなことも読みました。
(今の所、私のやっている内容では、ロックがなくても平気?たまたま重複しなかっただけかもしれません)
https://shirusu-ni-tarazu.hatenablog.jp/entry/2013/07/02/042448
私の技術レベルでは、
・スレッドにする際の相互作用を考えたプログラムが書けそうにないかもしれない (エラー時に気付け無いなど)
・速さを重視したいので、プロセスの方を利用したい
のですが、共有したい変数はどのように扱えばよいでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/10 01:40 編集
2020/08/10 01:45
2020/08/10 02:05
2020/08/10 02:07
2020/08/10 02:09
2020/08/10 02:12
2020/08/10 02:18
2020/08/10 02:21 編集
2020/08/10 02:33
2020/08/10 02:36