我正在编写一个 gem,其中我必须分叉两个进程来启动两个 webrick 服务器。我想通过基类的类方法启动该服务器,因为应该只运行这两个服务器,而不是多个服务器。在运行时,我想调用这两台服务器上的一些方法来更改变量。
我的问题是,我无法通过基类的类方法访问分叉的实例变量。此外,我无法在基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器分叉到它自己的进程。
我尝试使用类变量,例如@@server
。但是当我尝试通过基类访问这个变量时,它是nil
。我读到在 Ruby 中不可能在分叉之间共享类变量,对吗?
那么,还有其他办法解决这个问题吗?我想过使用单例,但我不确定这是否是最好的主意。
当您分叉一个进程时,子进程和父进程的内存是分开的,因此您不能直接在它们之间共享变量。所以单例类在你的情况下不起作用。
解决办法是IPC http://en.wikipedia.org/wiki/Inter-process_communication, Ruby 都支持pipes http://www.ruby-doc.org/core-2.0/IO.html#method-c-pipe and sockets http://www.ruby-doc.org/stdlib-2.0/libdoc/socket/rdoc/index.html,这是 IPC 的两种最常用的形式,至少在 *NIX 上是这样。红宝石也支持分布式对象 http://www.ruby-doc.org/stdlib-2.0/libdoc/drb/rdoc/index.html,如果您需要更透明的界面。
你选择什么取决于工作。如果您知道想要在某个时刻将进程拆分到多台计算机上,请使用套接字或 drb。如果没有就用管道。
这是 Ruby 中管道的简短介绍 http://www.jstorimer.com/blogs/workingwithcode/7766091-introduction-to-ipc-in-ruby
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)