You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:24:31