Fork上的Fork,Ruby,ActiveRecord和File Descriptors
我理解当我们分叉一个进程时,子进程inheritance父类打开文件描述符和偏移的副本。 根据手册页,这指的是父母使用的相同文件描述符。 基于该理论在以下程序中
puts "Process #{Process.pid}" file = File.open('sample', 'w') forked_pid = fork do sleep(10) puts "Writing to file now..." file.puts("Hello World. #{Time.now}") end file.puts("Welcome to winter of my discontent #{Time.now}") file.close file = nil
问题1:hibernate10秒的分叉进程不应该丢失其文件描述符,并且在父进程完成并关闭文件并退出时无法写入文件。
问题2:但无论出于何种原因,如果这都有效,那么ActiveRecord在这种情况下如何失去连接。 它只有在我设置时才有效:reconnect => true
在ActiveRecord connect上:reconnect => true
它是否可以实际连接,这意味着它失去连接。
require "rubygems" require "redis" require 'active_record' require 'mysql2' connection = ActiveRecord::Base.establish_connection({ :adapter => 'mysql2', :username => 'root_user', :password => 'Pi', :host => 'localhost', :database => 'list_development', :socket => '/var/lib/mysql/mysql.sock' }) class User < ActiveRecord::Base end u = User.first puts u.inspect fork do sleep 3 puts "*" * 50 puts User.first.inspect puts "*" * 50 end puts User.first.inspect
require "rubygems" require "redis" require 'active_record' require 'mysql2' connection = ActiveRecord::Base.establish_connection({ :adapter => 'mysql2', :username => 'root_user', :password => 'Pi', :host => 'localhost', :database => 'list_development', :socket => '/var/lib/mysql/mysql.sock' }) class User < ActiveRecord::Base end u = User.first puts u.inspect fork do sleep 3 puts "*" * 50 puts User.first.inspect puts "*" * 50 end puts User.first.inspect
但是,对于Redis(v2.4.8)来说,同样的情况也是如此。 它是否尝试在内部重新连接叉?
如果是这样的话那么为什么写文件程序不会抛出错误。
有人可以解释这里发生的事情。 谢谢
如果您在一个进程中关闭文件描述符,它在另一个进程中保持有效,这就是您的文件示例正常工作的原因。
mysql的情况有所不同,因为它是一个套接字,最后有另一个进程。 当你在mysql适配器上调用close时(或当ruby退出时适配器被垃圾收集)它实际上向服务器发送一个“QUIT”命令,说你正在断开连接,所以服务器拆掉了它的插槽侧面。 一般来说,你真的不想在两个进程之间共享一个mysql连接 – 你会得到奇怪的错误,这取决于这两个进程是否同时尝试使用套接字。
如果关闭redis连接只是关闭套接字(而不是向服务器发送“我正在离开”消息),那么子连接应继续工作,因为套接字实际上不会被关闭
- Rails:模型无法保存缓存的列.counts
- 如何在具有名为“valid”的列的数据库上使用ActiveRecord? (DangerousAttributeError)
- map(&:id)work但not pluck(:id)
- Rails 4,has_many通过关联 – 查找关联的对象
- ActiveRecord在Heroku上错误地加载二进制字段,在OSX上很好
- 为什么组计算字段不会显示在查询结果中?
- 为什么Rails Active Record迁移会在mysql的varchar列上生成COLLATE utf8_bin
- 如何在ruby ActiveRecord中销毁没有ID列的记录?
- Rails belongs_to association(with:class_name)返回nil