2013-05-14 21 views
5

私は2つのプロセスをforkして2つのwebrickサーバーを起動する必要があります。私は基本クラスのクラスメソッドを通してこのサーバを起動したいのです。なぜなら、この2つのサーバは複数のサーバではなく、実行する必要があるからです。実行時に、変数を変更するためにこの2つのサーバー上のいくつかのメソッドを呼び出す必要があります。ruby​​プロセスで変数を共有する

私の問題は、基本クラスのクラスメソッドを使って、フォークのインスタンス変数にアクセスできないということです。さらに、基本クラスの内部でスレッドを使用することはできません。なぜなら、私はスレッドセーフではない別のライブラリを使用しているからです。だから私は自分のプロセスに各サーバーをフォークする必要があります。

@@serverのようなクラス変数で試してみました。しかし、私が基底クラスを通してこの変数にアクセスしようとすると、それはnilです。 Rubyではフォーク間でのクラス変数の共有は不可能だと私は理解していますか?

これを回避する方法はありますか?私はシングルトンを使うことを考えましたが、これがベストアイデアかどうかは分かりません。

+0

[プロセス間通信](http://en.wikipedia.org/wiki/Inter-process_communication) –

+0

だけでリンクが少し小さいです;)私は、プロセス間通信を知っているが、やります私は本当にこれを達成するために、XMLインターフェイスを実装するか、システム固有のプロトコルを扱う必要がありますか?私は考えていたかもしれません。 – 23tux

+0

@ 23tux:Rubyのプロセスは別物で、IPCはあなたの問題を解決する唯一の方法です。しかしRubyの宝石はたくさんありますが、それは助けになるかもしれません。おそらく、データをディスクに 'Marshal 'するだけで済みます。追加する必要があるのは、部分的な読み取り/書き込みを避けるためにいくつかのロックを加え、パフォーマンスを監視することだけです。次回は、ディスクに触れないようにローカルの 'memcached'にマーシャリングするかもしれません。 。 。 –

答えて

8

プロセスをフォークすると、子プロセスと親プロセスのメモリが分離されるため、それらの間で変数を直接共有することはできません。したがって、シングルトンクラスはあなたのケースでは動作しません。

解決策は、IPCです。Rubyは、少なくとも* NIXでは、IPCの2つの最も使用される形式であるpipessocketsの両方をサポートしています。より透明なインターフェースが必要な場合は、Rubyもdistributed objectsをサポートしています。

あなたが選んだのは仕事によって異なります。ある時点で複数のコンピュータでプロセスを分割したい場合は、ソケットまたはdrbを使用してください。パイプを持っていない場合。

Here's a short introduction to pipes in Ruby

関連する問題