在Ruby on Rails中使用fork来创建并行进程

pab*_*rti 12 ruby mysql fork mysql2 ruby-on-rails-3

我在Apache上使用Passenger生产了一个Rails 3应用程序.我有这个代码:

class Billing < ActiveRecord::Base
  after_save :sendEmails

  private
    def sendEmails
      fork do 
        UserMailer.clientBilling(self.user, self).deliver
      end
    end
end
Run Code Online (Sandbox Code Playgroud)

在localhost中,当应用程序创建帐单时,在保存后,应用程序会向用户发送电子邮件,一切正常.但是在服务器中,在应用程序创建计费之后,它会抛出与gem2M2相关的错误,"MySQL服务器已经消失"或"连接丢失"等错误,并且应用程序不会发送电子邮件.如果我删除fork它工作正常,但我想使用fork,我想创建一个单独的进程,因为它在发送电子邮件时需要很长时间.可能是什么问题呢?

Fre*_*ung 17

问题是分叉进程继承了它的一些父资源,例如它的文件描述符.特别是一个这样的共享资源是MySQL连接.当子进程完成其发送和退出的电子邮件时,它会关闭MySQL连接,从而关闭父进程连接.

如果你确实沿着这条路走下去(并且它有着相似的微妙之处)那么你需要做类似的事情

::ActiveRecord::Base.clear_all_connections!
Run Code Online (Sandbox Code Playgroud)

在你分叉之前

::ActiveRecord::Base.establish_connection
Run Code Online (Sandbox Code Playgroud)

然后.如果使用memcached或mongodb等服务,你必须做类似的事情.


J-_*_*_-L 9

使用带有导轨/乘客的叉子时要非常小心,它会变得非常凌乱!相反,你应该使用resque或delayed_job来完成这项任务!

  • 我花了7天的时间才发现错误消息"Mysql :: Error:在查询期间丢失了与MySQL服务器的连接"和"Mysql ::错误:MySQL服务器已经消失"是使用fork的结果. (2认同)