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