Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在heroku上的多进程unicorn rails应用程序中确保方法的单次运行_Ruby On Rails_Multithreading_Heroku_Locking - Fatal编程技术网

Ruby on rails 如何在heroku上的多进程unicorn rails应用程序中确保方法的单次运行

Ruby on rails 如何在heroku上的多进程unicorn rails应用程序中确保方法的单次运行,ruby-on-rails,multithreading,heroku,locking,Ruby On Rails,Multithreading,Heroku,Locking,我有一个Rails web应用程序,它在Heroku上运行,在多线程unicorn服务器上运行 在我的应用程序中,有一个方法最多只能由其中一个进程执行。如果发生并发调用,它们需要排队 最安全的方法是什么 我已经想到的是利用环境: def my_method sleep .1 while ENV['method_locked'] == 'locked' ENV['method_locked'] = 'locked' # Do my stuff ENV['method_locke

我有一个Rails web应用程序,它在Heroku上运行,在多线程unicorn服务器上运行

在我的应用程序中,有一个方法最多只能由其中一个进程执行。如果发生并发调用,它们需要排队

最安全的方法是什么

我已经想到的是利用环境:

def my_method
  sleep .1 while ENV['method_locked'] == 'locked'
  ENV['method_locked'] = 'locked'

  # Do my stuff

  ENV['method_locked'] = 'unlocked'
end
我对此有两个顾虑:

  • 变异的环境是否在多个unicorn进程之间共享?还有多个dynos?如果没有,是否有可用的快速存储
  • 如果并发性很高,查询和更新环境所需的时间是否仍然是允许并发的问题
我想到的另一个解决方案是生成一个单独的进程来处理这个问题,要么使用一个单独的worker dyno,要么以某种方式滥用另一个unicorn线程(尽管我不知道这是否可能)


我的问题是:有没有更好的方法来做到这一点?

变异
ENV
是行不通的。您只需更改当前进程的ENV,它不会影响其他进程

如果我是你,我可能会使用redis来处理我的锁。这里有一块我会用到的宝石:


如果你不知道,redis是单线程的,速度非常快。非常适合您的机箱。

很有趣!我曾多次偶然发现redis,主要是看到其他东西需要它,所以我知道它是什么。有趣的是,我从来没有想过为什么它如此流行,因为我想不出一个合适的用例,否则就不可能用更少的麻烦来完成。看来我这里有我的完美用例!非常感谢你的回答!