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