由于redis-rb是线程安全的,因此不将$redis = Redis.new
放入Unicorn的after_fork会产生什么负面影响?假设我有一个以上的工人。
与将这行代码放在environment.rb或初始化程序中相反?
答案 0 :(得分:4)
after_fork
与线程安全无关。它在父进程分叉子进程时使用,而不是在生成线程时使用。
为什么要关心
如果你从不分叉,你可能不会。
fork时,父进程和子进程共享文件和套接字描述符(db连接,redis连接)。如果您没有重新打开子节点中与Redis的连接,则父节点上的数据可以在套接字上与来自子节点的数据交错。
阅读A Unix Shell in Ruby Pipes以获取有关正在发生的事情的更详细说明。