我看到了一些我试图理解的奇怪问题,该问题的第一部分是试图了解数据库池在赛璐珞与赛璐珞/ZMQ 中的工作方式。
数据库池。
1) 螺纹。
5.times do Thread.new do puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}" sleep 5 end end sleep
请注意,我正在输出(ting)connection id
线程使用的那个。O/p
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833371600 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833339020 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833290000 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833282580 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70115833251100 ...
如您所见,执行 SQL 语句的每个线程返回不同的连接 ID。SELECT version();
根据我的假设,以上是完全有效的。
2) 赛璐珞
class PlainCelluloid include Celluloid def run puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}" sleep 5 end end 5.times do Sender.new.async.run end
O/p
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120202935840 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120202902760 <- connection id
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186634700 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186602720 ...
{"version"=>"PostgreSQL 9.4.5 .."} --- 70120186570720 ...
同样,正如预期的那样,每个赛璐珞演员都会产生一个新的连接 ID。完全有效。
3) 赛璐珞/ZMQ
- 发件人(又名客户端)
class Sender include Celluloid::ZMQ def initialize() @socket = Socket::Push.new @socket.connect('ipc:///tmp/qs11') end def write @socket.send('Hello') nil end end
- 接收器(又名服务器)
class Receiver include Celluloid::ZMQ def initialize() @socket = Socket::Pull.new @socket.bind('ipc:///tmp/qs11') end def run loop do async.handle_message @socket.read end end def handle_message(message) puts "#{ActiveRecord::Base.connection.execute('SELECT version();').first} --- #{ActiveRecord::Base.connection_id}" sleep 10 end end Receiver.new.async.run
现在,有趣的部分。执行此操作时。
5.times do Sender.new.async.write end
我看到以下输出。
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280 <- connection id
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
{"version"=>"PostgreSQL 9.4.5 ..."} --- 70299372892280
所有查询都使用相同的连接 ID。
这就是我的问题...
为什么Celluloid/ZMQ
使用相同的连接 ID。理想情况下,它应该为每个async
调用使用不同的。