概要
Parallelが簡単そうだったけど、Couldn't cleanly terminate all
みたいなエラーはいたのでQueueで実装。
新しいGemをインストールする必要がないのもいい。
参考にした記事はすべてThreadを2にしてたんだけど、適切なThread数がわからなかった。
追記:スクレイピングの処理をMacBook Pro プロセッサ 2.7 GHz Intel Core i5 で走らせてみた結果、3の場合が一番早かった。
サンプル
lib/tasks/parallel_sample.rake
namespace :parallel do
task sample: :environment
queue = Queue.new
nodes.each { |i| queue.push(i) }
queue.push(nil)
Array.new(3) do |i|
Thread.new do
begin
while num = queue.pop(true)
# コネクション数の増大を防ぐ
ActiveRecord::Base.connection_pool.with_connection do
p num
User.all.sample.update(value: num)
sleep 0.5
puts "end #{num}"
end
end
queue.push nil
end
end
end.each(&:join)
p "end!!!!!"
end
end
$ bundle exec rake parallel:sample
0
1
2
end 2
end 0
end 1
3
4
5
end 3
end 5
6
end 4
7
8
end 6
end 8
10
end 7
11
9
end 10
12
end 9
13
end 11
14
end 12
end 13
end 14
15
16
17
end 15
end 17
end 16
18
20
19
end 18
end 20
end 19
21
22
23
end 21
24
end 22
25
end 23
26
end 24
end 25
end 26
29
27
28
end 29
end 28
end 27
30
end 30
"end!!!!!"
参考
Rubyで並列処理が簡単にできるgem parallel - 酒と泪とRubyとRailsと http://morizyun.github.io/blog/parallel-process-ruby-gem/ @zyunnosukeさんから
【Ruby on Rails】非同期処理についてその②。 〜マルチスレッドとかマルチプロセスを実装してみた〜 - (ΦωΦ) http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/07/02/042448 @711fumiさんから