当多个进程尝试写同一个文件时会发生什么?

时间:2016-03-19 10:13:15

标签: ruby-on-rails ruby ruby-on-rails-4

由于第三方库的限制,我需要使用具有静态名称的文件。如果多个用户同时尝试写入该文件,Rails会发生什么? EACCESS错误?

我有办法绕过这个吗?

1 个答案:

答案 0 :(得分:1)

在Ruby级别,如果多个进程尝试写入文件将会发生什么情况取决于库如何使用该文件:在打开文件之前是否以及如何锁定文件以及文件打开的模式。只是工作,它可能会引发错误,或者(很可能,如果库没有做任何事情来处理这种情况)多个编写器可能会以一种可能破坏文件的方式静默地交错写入,或者最后一个写入者可能会赢。< / p>

在Rails级别,它取决于您如何运行Rails。如果在给定服务器上运行单个通常配置的Rails实例,则不会有任何问题,因为Rails本身默认是单线程的。如果您运行多个Rails实例(可能由Passenger或unicorn等应用程序服务器控制),您可能会遇到问题。

假设库不能为您处理多个编写器,您可以通过以下几种方式解决它:

  • 在每台服务器(或泊坞窗容器或chrooted环境)上仅运行一个Rails应用程序实例。
  • 分叉库并更改它以在文件名中包含进程ID。这就是我要做的事。