Rute进程的互斥锁

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

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

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

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

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

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