跳至内容 跳至搜索

Active Record 连接池队列

线程安全、公平、后进先出 (LIFO) 的队列。 intended to be used by ConnectionPool with which it shares a Monitor。

方法
A
C
D
N
P
S

类公共方法

new(lock = Monitor.new)

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 13
def initialize(lock = Monitor.new)
  @lock = lock
  @cond = @lock.new_cond
  @num_waiting = 0
  @queue = []
end

实例公共方法

add(element)

element 添加到队列中。 绝不阻塞。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 36
def add(element)
  synchronize do
    @queue.push element
    @cond.signal
  end
end

add_back(element)

element 添加到队列的末尾。 绝不阻塞。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 44
def add_back(element)
  synchronize do
    @queue.unshift element
    @cond.signal
  end
end

any_waiting?()

测试当前是否有线程在等待队列。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 21
def any_waiting?
  synchronize do
    @num_waiting > 0
  end
end

clear()

从队列中删除所有元素。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 59
def clear
  synchronize do
    @queue.clear
  end
end

delete(element)

如果 element 在队列中,则删除并返回它,否则返回 nil

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 52
def delete(element)
  synchronize do
    @queue.delete(element)
  end
end

num_waiting()

返回当前在此队列上等待的线程数。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 29
def num_waiting
  synchronize do
    @num_waiting
  end
end

poll(timeout = nil)

删除队列的头部元素。

如果 timeout 未提供,则在可用元素数量严格大于当前等待线程数量时(即不插队),删除并返回队列的头部元素。否则,返回 nil

如果提供了 timeout,当没有可用元素时,将阻塞,最多等待 timeout 秒,直到有元素可用。

引发

可用,则抛出此异常。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 86
def poll(timeout = nil)
  synchronize { internal_poll(timeout) }
end

size()

队列中的元素数量。

# File activerecord/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb, line 66
def size
  synchronize do
    @queue.size
  end
end