Spec-Zone.ru › Ruby 3.1

класс Thread::Queue

Родитель:
Объект

Класс Thread::Queue реализует очереди с множественными производителями и потребителями. Он особенно полезен в многопоточной программировании, когда информация должна безопасно обмениваться между несколькими потоками. Класс Thread::Queue реализует все необходимые семантики блокировки.

Класс реализует очередь типа FIFO. В очереди FIFO первые добавленные задачи являются первыми извлеченными.

Пример:

queue = Thread::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

consumer.join

Публичные методы класса

Thread::Queue.new → пустая_очередь Показать исходный код
Thread::Queue.new(enumerable) → очередь
static VALUE
rb_queue_initialize(int argc, VALUE *argv, VALUE self)
{
    VALUE initial;
    struct rb_queue *q = queue_ptr(self);
    if ((argc = rb_scan_args(argc, argv, "01", &initial)) == 1) {
        initial = rb_to_array(initial);
    }
    RB_OBJ_WRITE(self, &q->que, ary_buf_new());
    list_head_init(queue_waitq(q));
    if (argc == 1) {
        rb_ary_concat(q->que, initial);
    }
    return self;
}

Создаёт новый экземпляр очереди, необязательно используя содержимое enumerable для его начального состояния.

Пример:

q = Thread::Queue.new
#=> #<Thread::Queue:0x00007ff7501110d0>
q.empty?
#=> true

q = Thread::Queue.new([1, 2, 3])
#=> #<Thread::Queue:0x00007ff7500ec500>
q.empty?
#=> false
q.pop
#=> 1

Публичные методы экземпляра

<<(объект)

Добавляет указанный object в очередь.

Псевдоним для: push
clear() Показать исходный код
static VALUE
rb_queue_clear(VALUE self)
{
    struct rb_queue *q = queue_ptr(self);

    rb_ary_clear(check_array(self, q->que));
    return self;
}

Удаляет все объекты из очереди.

close Показать исходный код
static VALUE
rb_queue_close(VALUE self)
{
    struct rb_queue *q = queue_ptr(self);

    if (!queue_closed_p(self)) {
        FL_SET(self, QUEUE_CLOSED);

        wakeup_all(queue_waitq(q));
    }

    return self;
}

Закрывает очередь. Закрытую очередь нельзя открыть заново.

После выполнения вызова close следующие утверждения верны:

  • closed? вернёт true

  • close будет проигнорировано.

  • вызов enq/push/<< вызовет ClosedQueueError.

  • когда empty? равно false, вызов deq/pop/shift вернёт объект из очереди как обычно.

  • когда empty? равно true, deq(false) не будет приостанавливать поток и вернёт nil. deq(true) вызовет ThreadError.

ClosedQueueError унаследован от StopIteration, чтобы вы могли прервать цикл.

Пример:

q = Thread::Queue.new
Thread.new{
  while e = q.deq # wait for nil to break loop
    # ...
  end
}
q.close
closed? Показать исходный код
static VALUE
rb_queue_closed_p(VALUE self)
{
    return RBOOL(queue_closed_p(self));
}

Возвращает true, если очередь закрыта.

deq(non_block=false)

Извлекает данные из очереди.

Если очередь пуста, вызывающий поток приостанавливается до тех пор, пока данные не будут добавлены в очередь. Если non_block равно true, поток не приостанавливается, и поднимается ThreadError.

Псевдоним для: pop
empty? Показать исходный код
static VALUE
rb_queue_empty_p(VALUE self)
{
    return RBOOL(queue_length(self, queue_ptr(self)) == 0);
}

Возвращает true, если очередь пуста.

enq(объект)

Добавляет указанный object в очередь.

Псевдоним для: push
length Показать исходный код
static VALUE
rb_queue_length(VALUE self)
{
    return LONG2NUM(queue_length(self, queue_ptr(self)));
}

Возвращает длину очереди.

Также алиас для: size
num_waiting() Показать исходный код
static VALUE
rb_queue_num_waiting(VALUE self)
{
    struct rb_queue *q = queue_ptr(self);

    return INT2NUM(q->num_waiting);
}

Возвращает количество потоков, ожидающих в очереди.

pop(non_block=false) Показать исходный код
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, queue_ptr(self), should_block);
}

Извлекает данные из очереди.

Если очередь пуста, вызывающий поток приостанавливается до тех пор, пока данные не будут добавлены в очередь. Если non_block равно true, поток не приостанавливается, и поднимается ThreadError.

Также алиас для: deq, shift
push(объект) Показать исходный код
static VALUE
rb_queue_push(VALUE self, VALUE obj)
{
    return queue_do_push(self, queue_ptr(self), obj);
}

Добавляет указанный object в очередь.

Также алиас для: enq, <<
shift(non_block=false)

Извлекает данные из очереди.

Если очередь пуста, вызывающий поток приостанавливается до тех пор, пока данные не будут добавлены в очередь. Если non_block равно true, поток не приостанавливается, и поднимается ThreadError.

Псевдоним для: pop
size

Возвращает длину очереди.

Псевдоним для: length

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API