Spec-Zone.ru › Ruby 2.4

класс 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 36
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 51
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 124
def all_waits
  until @threads.empty?
    th = next_wait
    yield th if block_given?
  end
end

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

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

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

Возвращает true, если в пуле нет запущенных потоков.

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

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

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

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

join_nowait(*threads) Показать исходный код
# File lib/thwait.rb, line 87
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 108
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