класс ActiveRecord::ConnectionAdapters::ConnectionPool::Queue
Потокобезопасная, справедливая очередь FIFO. Предназначена для использования с ConnectionPool, с которым она разделяет монитор. Но может быть и универсальной очередью Queue.
Очередь Queue из стандартной библиотеки 'thread' могла бы заменить этот класс, за исключением того, что стандартная библиотека не поддерживает ожидание с таймаутом.
Публичные методы класса
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 75 def initialize(lock = Monitor.new) @lock = lock @cond = @lock.new_cond @num_waiting = 0 @queue = [] end
Публичные методы экземпляра
Добавить element в очередь. Никогда не блокирует.
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 98
def add(element)
synchronize do
@queue.push element
@cond.signal
end
end Проверить, ожидают ли в данный момент какие-либо потоки в очереди.
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 83
def any_waiting?
synchronize do
@num_waiting > 0
end
end Удалить все элементы из очереди.
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 113
def clear
synchronize do
@queue.clear
end
end Если element находится в очереди, удалить и вернуть его, или nil.
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 106
def delete(element)
synchronize do
@queue.delete(element)
end
end Возвращает количество потоков, которые в данный момент ожидают в этой очереди.
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 91
def num_waiting
synchronize do
@num_waiting
end
end Удалить первый элемент из очереди.
Если timeout не указан, удалить и вернуть первый элемент из очереди, если количество доступных элементов строго больше количества потоков, которые в данный момент ожидают (то есть, не выходить вперед в очереди). В противном случае вернуть nil.
Если timeout указан, заблокировать, если доступных элементов нет, ожидая до timeout секунд, пока элемент не станет доступным.
Возбуждает:
-
ConnectionTimeoutError, если
timeoutуказан и ни один элемент
не становится доступным после timeout секунд,
# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb, line 133
def poll(timeout = nil)
synchronize do
if timeout
no_wait_poll || wait_poll(timeout)
else
no_wait_poll
end
end
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.