質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3970閲覧

[Ruby] マルチスレッドが遅い

k_teluki

総合スコア35

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/02/03 10:37

マルチスレッドで画像をダウンロードして画像処理した上で保存するという処理を作っています。
マルチスレッドといえど、画像処理してるのである程度時間がかかるのはわかるのですが、③が表示されるまでに時間がかかります。
①でどのくらい処理したかが次のように表示されます。

# 左の数字が更新されていく 1 / 1000

1000 / 1000になった時点ですべてのスレッドが終了しているはずなので③がすぐに表示されるはずだと思います。
③が表示されるまでに30秒〜60秒くらいかかるのはさすがにどこかに問題があるのかなと考えているのですがよくわかりません。
ちょっと説明がわかりづらいかもしれませんがご助力いただければ幸いです。
よろしくお願いします。

ruby

1# videosにはDBから取得したデータが1000件入っている 2total = videos.length 3puts "Video count: #{total}" 4 5max_thread = 10 # 最大スレッド数 6ary_threads = [] 7locker = Mutex::new 8 9count = 0 10data = [] 11 12max_thread.times do |i| 13 # autoloadでエラーになるので1つ目のスレッド以外は遅延させる 14 sleep(0.5) if i > 0 15 16 ary_threads << Thread.start do 17 loop do 18 video = locker.synchronize { videos.pop } 19 break if video.blank? 20 21 begin 22 # AverageHash.calcで画像のハッシュを生成している 23 # video.pictureは動画のサムネ 24 image = AverageHash.calc(video.picture) 25 # video.picture_hashはハッシュを入れとくカラム 26 video.picture_hash = image[0] 27 data << video 28 rescue => e 29 # NO OP 30 end 31 32 # ① 処理した数をカウントして表示 33 count += 1 34 print "#{count} / #{total}\r" 35 end 36 end 37end 38 39# ② すべてのスレッドが終了するのを待つ 40ary_threads.each { |th| th.join } 41 42# ③ 43puts 44puts "Finished All Threads." 45 46# DBに保存 47data.each{ |video| video.save }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ふつうのRubyのマルチスレッドにはGVL(Giant VM Lock)があるので、I/O操作や一部のC拡張以外のRubyコードは並列実行されませんるりま)。Ruby部分まで並列実行させるには、プロセスごと別に立ち上げる必要があります。

なお、Javaで書かれたJRubyでは、Javaのスレッドを使うので、Rubyコードも並列実行されます。

P.S. カウント表示まわりはロックしなくていいのか気になりました。

投稿2017/02/03 11:06

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問