[[Ruby]]
大量の応答待ちをしたい時とかに有利なのよねスレッド。
でも無条件にバカバカ作るとリソース食べつくしちゃう。制限かけなくちゃね。
* 参考にしたサイト [#rfef68ee]
- http://qiita.com/na-o-ys/items/62e9abc21c236908c958
さっすが、わすりやすいわね。
これを参考にサンプルを書いてみたの。テーマは「 ''たくさんスレッドあるけど、同時に動かすのは二つよ?'' 」ね。
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."
* ダメだった。 [#z0e8d292]
……でやってたんだけど、ダメみたいね。
いえ、普通はいいんだけど、スレッド総数が膨れ上がるとエラーになってしまうのよね orz
というわけで、やりなおし。
* 訂正版(2016/05/27) [#bb43729a]
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 ね。
これでちょっと様子を見てみましょう。