Queue
class Queue
父:对象
Queue类实现了多生产者,多用户队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用。Queue类实现了所有必需的锁定语义。
该类实现FIFO类型的队列。在FIFO队列中,添加的第一个任务是第一个检索的。
例:
require 'thread'
queue = Queue.new
producer = Thread.new do
5.times do |i|
sleep rand(i) # simulate expense
queue << i
puts "#{i} produced"
end
end
consumer = Thread.new do
5.times do |i|
value = queue.pop
sleep rand(i/2) # simulate expense
puts "consumed #{value}"
end
end
公共类方法
new() Show source
创建一个新的队列实例。
static VALUE
rb_queue_initialize(VALUE self)
{
RSTRUCT_SET(self, QUEUE_QUE, ary_buf_new()
RSTRUCT_SET(self, QUEUE_WAITERS, ary_buf_new()
return self;
}
公共实例方法
<<(p1)
别名为:推送
clear() Show source
从队列中删除所有对象。
static VALUE
rb_queue_clear(VALUE self)
{
rb_ary_clear(GET_QUEUE_QUE(self)
return self;
}
关闭显示源代码
关闭队列。已关闭的队列无法重新打开。
在完成关闭调用之后,以下情况属实:
closed?
将返回true
close
将被忽略。
- 调用enq / push / <<将返回零。
- 当
empty?
为false时,调用deq / pop / shift将像往常一样从队列中返回一个对象。
ClosedQueueError从StopIteration继承,这样就可以打开循环块。
Example:
q = Queue.new
Thread.new{
while e = q.deq # wait for nil to break loop
# ...
end
}
q.close
static VALUE
rb_queue_close(VALUE self)
{
return queue_do_close(self, FALSE
}
closed? Show source
true
如果队列关闭,则返回。
static VALUE
rb_queue_closed_p(VALUE self)
{
return queue_closed_p(self) ? Qtrue : Qfalse;
}
deq(*args)
别名为:pop
empty? Show source
true
如果队列为空则返回。
static VALUE
rb_queue_empty_p(VALUE self)
{
return queue_length(self) == 0 ? Qtrue : Qfalse;
}
enq(p1)
别名为:推送
长度显示源
size
返回队列的长度。
static VALUE
rb_queue_length(VALUE self)
{
unsigned long len = queue_length(self
return ULONG2NUM(len
}
还有别名:大小
num_waiting() Show source
返回在队列中等待的线程数。
static VALUE
rb_queue_num_waiting(VALUE self)
{
unsigned long len = queue_num_waiting(self
return ULONG2NUM(len
}
pop(non_block=false) Show source
deq(non_block=false)
shift(non_block=false)
从队列中检索数据。
如果队列为空,则将调用线程挂起,直到将数据推入队列。如果non_block
为真,该线程不会被挂起并被ThreadError
提升。
static VALUE
rb_queue_pop(int argc, VALUE *argv, VALUE self)
{
int should_block = queue_pop_should_block(argc, argv
return queue_do_pop(self, should_block
}
还有别名:deq,shift
push(object) Show source
enq(object)
<<(object)
将给定推object
送到队列中。
static VALUE
rb_queue_push(VALUE self, VALUE obj)
{
return queue_do_push(self, obj
}
另外别名为:enq,<<
shift(*args)
别名为:pop
size()
别名为:长度