如果我在after_fork中没有$ redis = Redis.new,会发生什么?

时间:2012-09-30 15:54:37

标签: ruby-on-rails redis unicorn

由于redis-rb是线程安全的,因此不将$redis = Redis.new放入Unicorn的after_fork会产生什么负面影响?假设我有一个以上的工人。

与将这行代码放在environment.rb或初始化程序中相反?

1 个答案:

答案 0 :(得分:4)

after_fork与线程安全无关。它在父进程分叉子进程时使用,而不是在生成线程时使用。

为什么要关心

如果你从不分叉,你可能不会。

fork时,父进程和子进程共享文件和套接字描述符(db连接,redis连接)。如果您没有重新打开子节点中与Redis的连接,则父节点上的数据可以在套接字上与来自子节点的数据交错。

阅读A Unix Shell in Ruby Pipes以获取有关正在发生的事情的更详细说明。