gpt4 book ai didi

mysql - 为什么这些线程化的 ActiveRecord 查询不能同时运行?

转载 作者:行者123 更新时间:2023-11-30 23:01:46 25 4
gpt4 key购买 nike

我正在尝试了解生产中的问题,所以我将此代码段放入开发中的 Controller 操作中以进行测试:

start = Time.now
num_threads = 6
results = Queue.new
saved_results = []
threads = []
connections = []
semaphore = Mutex.new

# start threads
(1..num_threads).each do |i|
threads << Thread.new do
#semaphore.synchronize { connections << ActiveRecord::Base.connection } # for cleanup?

#ActiveRecord::Base.connection.execute("select sleep(1.6);") # runs sequentially
sleep(1.6) # runs concurrently
result = User.find_by_id(i)
results << [i, result]
end
end

# end option 1 - let everyone finish
threads.each(&:join)

# end option 2 - simulate early exit condition
#while saved_results.count < 3 do saved_results << results.pop end
#threads.each(&:exit)

# cleanup/close open connections?
#connections.select(&:active?).each(&:disconnect!)

elapsed = Time.now - start
render :text => [ elapsed.to_s, saved_results.size, results.size ].join(", ")

sleep(1.6) 按照预期在大约 1.6 秒内执行。

然而,ActiveRecord select sleep(1.6); 需要 6 * 1.6 = 9.6 秒,尽管 mysql 控制台 show processlist; 显示为每个线程*打开独立连接。

这是怎么回事?为什么 ActiveRecord 查询不能同时运行?我也在生产控制台中遇到过这种情况。

我确实在 config/environment.rb 中设置了 config.threadsafe!。如果重要的话,我使用的是 Rails 2.3。

*这些连接必须手动关闭?生产总是有很多打开的连接什么都不做,导致 Mysql::Error: Too many connections。我可能会将此问题作为另一个问题提交。

最佳答案

一些说明:

  • rails 2.3 本身是 afaik 本身并不是真正的线程安全,因为 rails 3.x 是。但对于这种情况,我认为这并不重要。
  • 您至少应该使用 ruby​​ 1.9。 1.8 中的“绿色线程”不是最佳的。虽然在 ruby​​ 1.9 中运行仍然不是最优的,但它更好。对于真正的线程,您应该检查 jruby 或 rubinius(无 GIL)。
  • 您应该使用 mysql2 gem。 mysql gem 在等待数据库响应时保持 GIL。

关于mysql - 为什么这些线程化的 ActiveRecord 查询不能同时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com