Spec-Zone.ru › Ruby 2.4

класс 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