6

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

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

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

那么,有没有其他方法可以解决这个问题?我想过使用单例,但我不确定这是否是最好的主意。

4

1 回答 1

9

当你 fork 一个进程时,子进程和父进程的内存是分开的,所以你不能直接在它们之间共享变量。所以单例类在你的情况下不起作用。

解决方案是IPC,Ruby 支持管道套接字,这是 IPC 最常用的两种形式,至少在 *NIX 上是这样。如果您需要更透明的界面,Ruby 还支持分布式对象。

你选择什么取决于工作。如果您知道自己想在某个时候将进程拆分到多台计算机上,请使用套接字或 drb。如果不使用管道。

这是 Ruby 中管道的简短介绍

于 2013-05-14T10:13:50.400 回答