Spec-Zone.ru › Ruby 2.3

класс 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 37
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 52
def initialize(*threads)
  @threads = []
  @wait_queue = Queue.new
  join_nowait(*threads) unless threads.empty?
end

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

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

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

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

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

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

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

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

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

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

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

join_nowait(*threads) Показать исходный код
# File lib/thwait.rb, line 88
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 109
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 равно true и завершившихся потоков нет, возбуждает 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