5

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

4

3 回答 3

15

如果只需要防止多个写入者同时处理一个文件,可以使用该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注意:如果在锁定文件后抛出未捕获的异常,则将解锁调用放在块中对于防止死锁很重要。

于 2009-09-22T18:23:31.987 回答
2

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

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

于 2009-09-22T18:04:55.963 回答
2

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

于 2009-09-22T18:13:55.727 回答