Spec-Zone.ru › Ruby 2.5

класс ThWait

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

Этот класс отслеживает завершение нескольких потоков. Основной функционал (ожидание завершения указанных потоков) доступен через метод класса ThreadsWait.all_waits. Более тонкий контроль можно получить с помощью методов экземпляра.

Пример:

ThreadsWait.all_waits(thr1, thr2, ...) do |t|
  STDERR.puts "Thread #{t} has terminated."
end

th = ThreadsWait.new(thread1,...)
th.next_wait # next one to be done

Атрибуты

threads[R]

Возвращает массив потоков, которые еще не завершены.

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

all_waits(*threads) { |thread| ... } Показать исходный код
# File lib/thwait.rb, line 35
def ThreadsWait.all_waits(*threads) # :yield: thread
  tw = ThreadsWait.new(*threads)
  if block_given?
    tw.all_waits do |th|
      yield th
    end
  else
    tw.all_waits
  end
end

Ожидает завершения всех указанных потоков. Если предоставлен блок, он выполняется для каждого завершенного потока.

new(*threads) Показать исходный код
# File lib/thwait.rb, line 50
def initialize(*threads)
  @threads = []
  @wait_queue = Thread::Queue.new
  join_nowait(*threads) unless threads.empty?
end

Создаёт объект ThreadsWait, указывая потоки, на которых нужно ожидать завершения. Неблокирующий.

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

all_waits() { |th| ... } Показать исходный код
# File lib/thwait.rb, line 123
def all_waits
  until @threads.empty?
    th = next_wait
    yield th if block_given?
  end
end

Ожидает завершения всех указанных потоков. Если для метода предоставлен блок, он выполняется при завершении каждого потока.

Возбуждает исключения аналогично next_wait.

empty?() Показать исходный код
# File lib/thwait.rb, line 62
def empty?
  @threads.empty?
end

Возвращает true, если в пуле нет ни одного работающего потока.

finished?() Показать исходный код
# File lib/thwait.rb, line 69
def finished?
  !@wait_queue.empty?
end

Возвращает true, если какой-либо поток завершился и готов к сбору.

join(*threads) Показать исходный код
# File lib/thwait.rb, line 77
def join(*threads)
  join_nowait(*threads)
  next_wait
end

Ожидает завершения указанных потоков и возвращается, когда один из них завершится.

join_nowait(*threads) Показать исходный код
# File lib/thwait.rb, line 86
def join_nowait(*threads)
  threads.flatten!
  @threads.concat threads
  for th in threads
    Thread.start(th) do |t|
      begin
        t.join
      ensure
        @wait_queue.push t
      end
    end
  end
end

Указывает потоки, на которых этот объект будет ожидать завершения, но фактически ожидание не выполняется.

next_wait(nonblock = nil) Показать исходный код
# File lib/thwait.rb, line 107
def next_wait(nonblock = nil)
  ThreadsWait.fail ErrNoWaitingThread if @threads.empty?
  begin
    @threads.delete(th = @wait_queue.pop(nonblock))
    th
  rescue ThreadError
    ThreadsWait.fail ErrNoFinishedThread
  end
end

Ожидает завершения любого из указанных потоков и возвращает завершившийся.

Если нет потока для ожидания, возбуждает ErrNoWaitingThread. Если nonblock истинно, а завершившегося потока нет, возбуждает ErrNoFinishedThread.

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

Spec-Zone.ru

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