通过ruby进程共享变量

时间:2013-05-14 08:47:03

标签: ruby multithreading process fork

我正在写一个gem,我必须分叉两个进程,这两个进程启动两个webrick服务器。我想通过基类中的类方法启动此服务器,因为应该只运行这两个服务器,而不是多个服务器。在运行时,我想在这两台服务器上调用一些方法来改变变量。

我的问题是,我无法通过基类的类方法访问forks的实例变量。此外,我不能在我的基类中使用线程,因为我在使用另一个非线程安全的库。所以我必须将每个服务器分配给它自己的进程。

我尝试使用类变量,例如@@server。但是当我尝试通过基类访问这些变量时,它是nil。我读过在Ruby中不可能在forks中共享类变量,我是对的吗?

那么,还有其他方法吗?我想过使用单身,但我不确定这是不是最好的主意。

1 个答案:

答案 0 :(得分:8)

当您分叉进程时,子进程和父进程的内存是分开的,因此您无法直接在它们之间共享变量。因此,单例类不适用于您的情况。

解决方案是IPC,Ruby支持pipessockets这两种最常用的IPC形式,至少在* NIX上。如果您需要更透明的界面,Ruby还支持distributed objects

您选择的内容取决于工作。如果您知道要在某些时候在多台计算机上拆分进程,请使用套接字或drb。如果没有管道。

Here's a short introduction to pipes in Ruby