menu
書いてる野郎
orebike@gmail.com
Ruby の並列処理のためのライブラリ Parallel に関して
Gemfile
source "https://rubygems.org" gem "parallel"
$ bundle install --path vendor/bundle
このように書くと 1〜100 までの表示を4本並行(プロセスで)実行する。in_thread と書くとマルチスレッド処理になる。
Parallel.each(1..100, in_process: 4) do | i | p i end
このように、並列に4本ずつ実行されるため、順番が多少崩れて表示されるのがわかる。
$ bundle exec ruby hoge.rb 1 7 3 8 2 5 4 6 10 12 13 14 9 15 16 17 11 18 19 21 20 23 22 24 25 27 26 29 28 30 31 32 33 35 34 36 37 38 39 40 41 42 43 44 45 47 46 48 49 51 50 53 52 55 54 56 57 58 60 59 61 62 63 64 65 66 67 68 69 70 71 72 74 73 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 99 100 98
全体の処理としては Parallel が統合管理していて、全部の処理が終わるまで、each のブロックの処理は終わらないことになっている。 つまり、最後の終了に関しては同期的に実行されることになっている。
Ruby はその設計上マルチスレッド処理ではマルチコアCPUの恩恵をあまりうけられないようで、マルチプロセスで動かしたほうが明らかにパフォーマンスがよい。