用于Rails进程的互斥锁

时间:2009-09-22 16:52:49

标签: ruby-on-rails mutex

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

3 个答案:

答案 0 :(得分:14)

如果您只需要阻止多个编写者同时处理文件,您可以使用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

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

答案 1 :(得分:2)

据我所知,在这样的环境中执行此操作的唯一方法是使用基于文件的信号量 - 触摸锁定文件,执行您的工作,删除锁定文件。如果文件锁定,则使进程失败。

您还可以拥有一个写入线程文件的服务,并让应用程序与服务进行通信以修改文件,而不是让他们直接修改文件。

答案 2 :(得分:2)

您可以使用后台作业计划程序来完成实际工作,例如delayed_job(http://github.com/tobi/delayed_job)。