【问题标题】:Share variable through ruby processes通过 ruby​​ 进程共享变量
【发布时间】:2013-05-08 11:19:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 只是一个链接少一点;)我知道进程间通信,但我真的必须实现 XML 接口,或者处理系统特定的协议来实现这一点吗?我想,也许有一种“红宝石方式”可以做到这一点
  • @23tux:Ruby 进程是独立的,IPC 是(在顶层)解决您的问题的唯一方法。不过,有很多 Ruby gem 可以提供帮助。您可能只需 Marshal 将您的数据写入磁盘 - 您需要添加的只是一些锁定(以避免部分读取/写入),并密切关注性能。接下来可能是编组到本地 memcached 以避免接触磁盘。 . .

标签: ruby multithreading process fork


【解决方案1】:

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

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

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

Here's a short introduction to pipes in Ruby

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多