ruby-on-rails Rails进程的互斥

acruukt9  于 2023-05-08  发布在  Ruby
关注(0)|答案(4)|浏览(131)

当通过Passenger或Mongrel部署Rails时,您将运行应用程序的多个示例。在共享资源上建立互斥锁的最佳实践或模式是什么,例如写入本地文件或远程文件。我想确保两个进程不会同时写入同一个资源。

zzwlnbp8

zzwlnbp81#

如果你只需要防止多个writer同时处理一个文件,你可以使用File#flock方法向每个进程请求独占写锁:

fh = File.new("/some/file/path")
begin
  fh.flock(File::LOCK_EX)
  # ... write to the file here, or perform some other critical operation
ensure
  fh.flock(File::LOCK_UN)
end

注意:将unlock调用放在ensure块中对于防止死锁很重要,如果在锁定文件后抛出未捕获的异常。

5anewei6

5anewei62#

据我所知,在这样的环境中实现这一点的唯一方法是使用基于文件的信号量--触摸一个锁文件,做你的工作,删除锁文件。如果文件上有锁,则使进程失败。
您还可以使用一个服务来写入线程化的文件,并使应用程序与服务对话以修改文件,而不是让它们直接修改文件。

yyhrrdl8

yyhrrdl83#

您可以使用后台作业调度程序来执行实际工作,例如delayed_job(http://github.com/tobi/delayed_job)。

mm9b1k5b

mm9b1k5b4#

如果Rails示例连接到PostgreSQL,则可以使用PostgreSQL Advisory Lock(语法)(即具有应用程序定义含义的锁)作为互斥体。你也可以只使用一个锁定的表记录作为你的标志,但是:
虽然存储在表中的标志可以用于相同的目的,但咨询锁更快,避免了表膨胀,并且在会话结束时由服务器自动清理。
其他DB可以具有类似的功能。

相关问题