マルチスレッドで画像をダウンロードして画像処理した上で保存するという処理を作っています。
マルチスレッドといえど、画像処理してるのである程度時間がかかるのはわかるのですが、③が表示されるまでに時間がかかります。
①でどのくらい処理したかが次のように表示されます。
# 左の数字が更新されていく 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 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。