Rails - 美洲狮工人的并发问题
Rails - Concurrency issue with puma workers
我有一个 Puma 服务器配置为使用两个工作线程,每个工作线程有 16 个线程。并禁用 config.threadsafe!
以允许使用 puma 进行线程处理。
现在我有一个代码,我怀疑它没有使用线程安全,即使我在那里使用 Mutex
作为常量。我希望这段代码一次只由一个 puma 线程执行以避免并发问题,并为此使用 Mutex
。
现在,我的问题是,
Mutex
是否可以在使用 puma 线程时在多个 worker 上注入线程安全?据我了解,worker 是一个单独的进程,因此 Mutex 将不起作用。
- 如果 Mutex 不能按上述方式工作,那么在特定代码上启用线程安全的解决方案是什么?
代码示例
class MyService
...
MUTEX = Mutex.new
...
def initialize
...
end
def doTask
MUTEX.synchronize do
...
end
end
end
MUTEX
对我不起作用,所以我需要找到另一种方法。请参阅下面的解决方案。
问题是,差异。 puma 线程同时向外部远程 API 发出请求,有时远程 API 需要时间来响应。
我想限制 API 请求的总数,但由于上述问题无法正常工作。
要解决此问题,
- 我创建了一个数据库 table,当请求发送到外部 API 时,我将在其中创建一个新条目
in-pogress
。
- 一旦 API 回复,我会将条目更新为
processed
- 在向外部 API 发出任何新请求之前,我正在检查具有
in-progress
的请求总数。
这样,我就可以限制从我的系统到外部的请求总数 API。
我有一个 Puma 服务器配置为使用两个工作线程,每个工作线程有 16 个线程。并禁用 config.threadsafe!
以允许使用 puma 进行线程处理。
现在我有一个代码,我怀疑它没有使用线程安全,即使我在那里使用 Mutex
作为常量。我希望这段代码一次只由一个 puma 线程执行以避免并发问题,并为此使用 Mutex
。
现在,我的问题是,
Mutex
是否可以在使用 puma 线程时在多个 worker 上注入线程安全?据我了解,worker 是一个单独的进程,因此 Mutex 将不起作用。- 如果 Mutex 不能按上述方式工作,那么在特定代码上启用线程安全的解决方案是什么?
代码示例
class MyService
...
MUTEX = Mutex.new
...
def initialize
...
end
def doTask
MUTEX.synchronize do
...
end
end
end
MUTEX
对我不起作用,所以我需要找到另一种方法。请参阅下面的解决方案。
问题是,差异。 puma 线程同时向外部远程 API 发出请求,有时远程 API 需要时间来响应。
我想限制 API 请求的总数,但由于上述问题无法正常工作。
要解决此问题,
- 我创建了一个数据库 table,当请求发送到外部 API 时,我将在其中创建一个新条目
in-pogress
。 - 一旦 API 回复,我会将条目更新为
processed
- 在向外部 API 发出任何新请求之前,我正在检查具有
in-progress
的请求总数。
这样,我就可以限制从我的系统到外部的请求总数 API。