Ruby

大量の応答待ちをしたい時とかに有利なのよねスレッド。

でも無条件にバカバカ作るとリソース食べつくしちゃう。制限かけなくちゃね。

参考にしたサイト

さっすが、わすりやすいわね。

これを参考にサンプルを書いてみたの。テーマは「 たくさんスレッドあるけど、同時に動かすのは二つよ? 」ね。

aa = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
names = aa.split("")
threads = []

locks = Queue.new
2.times{locks.push(:lock)}

names.each do |name|
 threads << Thread.new do
   lock = locks.pop
   7.times do |i|
     print "#{name}:#{i}\n"
     sleep rand(3)
   end
   locks.push lock
 end
end

threads.each { |t| t.join }
puts "\nall threds are terminated."

ダメだった。

……でやってたんだけど、ダメみたいね。

いえ、普通はいいんだけど、スレッド総数が膨れ上がるとエラーになってしまうのよね orz

というわけで、やりなおし。

訂正版(2016/05/27)

locks = Queue.new
2.times { locks.push :lock }

(1..99).map{|i|
  Thread.new{
    lock = locks.pop
    print "#{i} START\n"
    sleep rand(1..8)
    print "#{i} END\n"
    locks.push lock
  }
}.each{|t|t.join}

わかりやすく、最もシンプルにしてみたけど、どうかしら。

キモは、配列.map ね。

これでちょっと様子を見てみましょう。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-27 (金) 17:15:27