Rails - puma 工作人员的并发问题

Par*_*rth 5 ruby thread-safety ruby-on-rails-3 puma

我有一个 Puma 服务器,配置为使用两个工作线程,每个工作线程有 16 个线程。并config.threadsafe!禁用允许使用 puma 的线程。

现在我有一个代码,我怀疑它没有使用线程安全,即使我已经Mutex在其中用作常量。我希望这段代码一次仅由一个 puma 线程执行,以避免并发问题,并使用Mutex它。

现在,我的问题是,

  1. Mutex在多个工作人员上使用 puma 线程时是否可以注入线程安全?据我了解,工作线程是一个单独的进程,因此互斥锁不起作用。
  2. 如果互斥体不能按上述方式工作,那么在特定代码上启用线程安全的解决方案是什么?

代码示例

class MyService
  ...
  MUTEX = Mutex.new     
  ...

  def initialize
   ...
  end

  def doTask
    MUTEX.synchronize do
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Par*_*rth 1

MUTEX东西对我不起作用,所以我需要寻找另一种方法。请参阅下面的解决方案。

问题是,迪夫。puma 线程同时向外部远程 API 发出请求,有时远程 API 需要一些时间才能响应。

我想限制 API 请求总数,但由于上述问题而无法正常工作。

为了解决这个问题,

  • 我创建了一个数据库表,in-pogress当请求发送到外部 API 时,我将在其中创建一个新条目。
  • 一旦该 API 响应,我会将条目更新为processed
  • in-progress在向外部 API 发出任何新请求之前,我正在检查总请求数。

这样,我就可以限制从我的系统到外部 API 的请求总数。