如何在Rails请求处理过程中获取Puma Worker索引?
获取Puma Worker索引的最优实现方式
场景说明
当Rails使用Puma集群模式启动时,控制台会输出每个Worker的索引与PID信息:
[17042] - Worker 0 (PID: 17069) booted in 0.01s, phase: 0 [17042] - Worker 1 (PID: 17070) booted in 0.01s, phase: 0
在请求处理流程中,可通过Process.pid获取当前Worker的PID:
> Process.pid => 17069
问题
如何在请求处理过程中获取当前Puma Worker的索引(如0、1这类数值)?
已知Puma::Cluster::Worker类提供了index方法获取该值,但无法直接拿到处理当前请求的该类实例。目前通过ObjectSpace可以实现,但希望有更高效的方案:
> ObjectSpace.each_object(Puma::Cluster::Worker) { |x| p x.index } 0 => 1
最优解决方案
方式一:读取环境变量(推荐)
Puma在启动Worker子进程时,会自动将Worker索引存入环境变量PUMA_WORKER_INDEX,直接读取该变量即可获取索引,无需依赖内部对象:
# 获取字符串格式的索引,转成整数使用 ENV['PUMA_WORKER_INDEX'].to_i
方式二:通过Puma集群对象获取
若需直接获取Puma::Cluster::Worker实例,可通过Puma.cluster对象定位当前Worker,但该方式仅在Puma集群模式下有效:
if defined?(Puma) && Puma.respond_to?(:cluster) current_worker = Puma.cluster.worker_for(Process.pid) current_worker&.index end
相比ObjectSpace遍历的方式,以上两种方案更高效且更符合Puma的设计规范,其中环境变量的方式兼容性最好,不受Puma版本变动影响。
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

