aliases: Queue
要約
Queue はスレッド間の FIFO(first in first out) の通信路です。スレッドが空のキューを読み出そうとすると停止します。キューになんらかの情報が書き込まれると実行は再開されます。
最大サイズが指定できる Queue のサブクラス Thread::SizedQueue も提供されています。
例
require 'thread' q = Queue.new th1 = Thread.start do while resource = q.pop puts resource end end [:resource1, :resource2, :resource3, nil].each{|r| q.push(r) } th1.join
実行すると以下のように出力します。
$ ruby que.rb resource1 resource2 resource3
目次
特異メソッド
new -> Thread::Queue
[permalink][rdoc][edit]new(items) -> Thread::Queue
-
新しいキューオブジェクトを生成します。
- [PARAM] items:
- 初期値を Enumerable で指定します。
q = Queue.new q = Queue.new([a, b, c]) q = Queue.new(items)
インスタンスメソッド
push(value) -> ()
[permalink][rdoc][edit]self << value -> ()
enq(value) -> ()
-
キューの値を追加します。待っているスレッドがいれば実行を再開させます。返り値は不定です。
clear -> ()
[permalink][rdoc][edit]-
キューを空にします。返り値は不定です。
q = Queue.new [:resource1, :resource2, :resource3, nil].each { |r| q.push(r) } q.length # => 4 q.clear q.length # => 0
close -> self
[permalink][rdoc][edit]-
キューを close します。close 済みのキューを再度 open することはできません。
close 後は以下のように動作します。
- Thread::Queue#closed? は true を返します
- Thread::Queue#close は無視されます
- Thread::Queue#enq/push/<< は ClosedQueueError を発生します
- Thread::Queue#empty? が false を返す場合は Thread::Queue#deq/pop/shift は通常通りオブジェクトを返します
また、ClosedQueueError は StopIteration を継承しているため、 close する事でループから脱出する事もできます。
例:
q = Queue.new Thread.new{ while e = q.deq # wait for nil to break loop # ... end } q.close
closed? -> bool
[permalink][rdoc][edit]-
キューが close されている時に true を返します。
q = Queue.new [:resource1, :resource2, :resource3, nil].each { |r| q.push(r) } q.closed? # => false q.close q.closed? # => true
pop(non_block = false) -> object
[permalink][rdoc][edit]shift(non_block = false) -> object
deq(non_block = false) -> object
-
キューからひとつ値を取り出します。キューが空の時、呼出元のスレッドは停止します。
- [PARAM] non_block:
- true を与えると、キューが空の時に例外 ThreadError が発生します。
require 'thread' q = Queue.new th1 = Thread.start do while resource = q.pop puts resource end end [:resource1, :resource2, :resource3, nil].each { |r| q.push(r) } th1.join
require 'thread' q = Queue.new th1 = Thread.start do while resource = q.pop puts resource end end [:resource1, :resource2, :resource3, nil].each { |r| q.push(r) } begin th1.join q.pop(true) rescue => e p e end # => resource1 # resource2 # resource3 # => #<ThreadError: queue empty> # => "queue empty"
empty? -> bool
[permalink][rdoc][edit]-
キューが空の時、真を返します。
q = Queue.new q.empty? # => true q.push(:resource) q.empty? # => false
length -> Integer
[permalink][rdoc][edit]size -> Integer
-
キューの長さを返します。
q = Queue.new [:resource1, :resource2, :resource3, nil].each { |r| q.push(r) } q.length # => 4
num_waiting -> Integer
[permalink][rdoc][edit]-
キューを待っているスレッドの数を返します。
require 'thread' q = SizedQueue.new(1) q.push(1) t = Thread.new { q.push(2) } sleep 0.05 until t.stop? q.num_waiting # => 1 q.pop t.join