[[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 ね。

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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS