Phusion Passenger Server 免费版与企业版和线程局部变量

问题描述 投票:0回答:3

对于“释放”乘客的并发请求,当前线程是否期望相同?

我有一个错误,线程本地 ruby 变量不独立于并发请求。即,两个并发请求显示相同的线程 ID(通过睡眠来模拟以减慢速度)。

Passenger 企业版有什么不同吗?

是否有正确的方法来获取在 Rails 中单个请求的生命周期内隔离的线程局部变量?

更新:

  1. 问题并非乘客特有。 Thin 也存在问题。
  2. 其他库,例如 paper_trail 可能存在此问题:https://github.com/airblade/paper_trail/issues/499
  3. 这里有一个潜在的解决方案:https://github.com/steveklabnik/request_store,以及我所看到的问题的详细描述。
ruby-on-rails ruby multithreading passenger
3个回答
1
投票

如果您想要一个请求局部变量,请考虑将其放入 Rack 请求环境对象中。请参阅此问题的答案以获取更完整的概述。

关于线程局部变量,这当然看起来像是意外的行为,但 Passenger 完全有可能正在做一些不能保证单个线程在其整个生命周期内由请求拥有的事情。

Rack::Lock
中间件通常通过在整个请求周围使用互斥体来解决这个问题,但如果您删除了它,则不能保证同步。一般来说,线程局部变量是一种代码味道,并且可能表明您正在做一些不应该做的事情。


0
投票

已解决:

Thread.current[:something] 与您对 Thin 和 Passenger 的期望不同!!

不确定 Unicorn 和 Puma。

添加 request_store gem,然后按照说明解决此问题。


0
投票

当您使用

sleep
模拟减慢速度时,它还会模拟 Blocking IO,此时 Ruby 将允许不同的线程接管处理,直到 Blocking IO 完成。根据其他线程正在做什么,可能会发生一些奇怪的事情。 如需专家对具体细节的精彩评论:

© www.soinside.com 2019 - 2024. All rights reserved.