簡體   English   中英

Rails-避免同時執行控制器動作

[英]Rails - Avoid simultaneous execution of controller action

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

即使應用程序運行多個過程(例如,乘客),類變量是否仍是持久變量? 這是個好主意嗎?

如果多個用戶請求相同的控制器操作,或者僅避免一個用戶同時執行,這是否可以工作?

您必須根據許多因素使用合適的工具來解決此問題。

  • 您的代碼是否在單個多線程進程上運行? 然后互斥鎖可能會有所幫助
  • 您的控制器操作是否僅由於數據庫操作而不能同時運行? 那么帶鎖的交易可能是您的解決方案
  • 您的代碼是否在多個進程上運行,並且可能同時在不同的服務器上運行? 然后應考慮使用外部鎖定(例如: https : //redis.io/topics/distlock

編輯:請不要實現自己的類似互斥體的機制( @@in_progress )。 有一些工具可以自動處理這些問題,並且已經過了良好的測試。

Edit2:如果您的控制器操作是等待來自API的同步響應,則這是要異步運行的作業。 考慮使用諸如Sidekiq之類的工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM