0
class ExampleController < ApplicationController

  def getAPI
      #retrieve and process data from API
  end

end

如何避免控制器操作同时执行?类变量会起作用吗?

class ExampleController < ApplicationController
  @@in_progress = false

  def getAPI
      render and return if @@in_progress
      @@in_progress = true
      #retrieve and process data from API
      @@in_progress = false
  end

end

即使应用程序与多个进程(例如乘客)一起运行,类变量是否持久。这是个好主意吗?

如果多个用户请求相同的控制器操作,这是否可行,或者它是否只避免一个用户同时执行?

4

1 回答 1

0

您必须根据许多因素使用正确的工具来解决这个问题。

  • 您的代码是否在单个多线程进程上运行?那么互斥锁可能会有所帮助
  • 您的控制器操作是否仅因为数据库操作而不会同时运行?那么带锁的交易可能是您的解决方案
  • 您的代码是否在多个进程上运行,并且可能同时在不同的服务器上运行?然后应该考虑使用外部锁(例如:https ://redis.io/topics/distlock )

编辑:请不要实现您自己的类似互斥锁的机制(@@in_progress)。有一些工具可以原子地处理这些东西,并且经过了很好的测试。

Edit2:如果您的控制器操作是等待来自 API 的同步响应,那么这是一个异步运行的作业。考虑使用 Sidekiq 等工具。

于 2018-02-05T13:53:47.003 回答