Spec-Zone.ru › Ruby 2.6

класс ThreadsWait

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

Этот класс отслеживает завершение нескольких потоков. Базовую функциональность (ожидание завершения указанных потоков) можно получить через метод класса 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