6

2 つの webrick サーバーを起動する 2 つのプロセスをフォークする必要がある宝石を書いています。複数のサーバーではなく、この2つのサーバーのみが実行されている必要があるため、基本クラスのクラスメソッドを介してこのサーバーを起動したいと考えています。実行時に、この 2 つのサーバーでいくつかのメソッドを呼び出して変数を変更したいと考えています。

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

のようなクラス変数で試してみました@@server。しかし、基本クラスを介してこの変数にアクセスしようとすると、nil. Ruby ではフォーク間でクラス変数を共有することはできないと読みましたが、そうですか?

それで、これを回避する他の方法はありますか?シングルトンを使用することを考えましたが、これが最善のアイデアかどうかはわかりません。

4

1 に答える 1

9

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

解決策はIPCです。Ruby はパイプソケットの両方をサポートします。これは、少なくとも *NIX では IPC の最もよく使用される 2 つの形式です。より透過的なインターフェースが必要な場合、Ruby は分散オブジェクトもサポートします。

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

ここでは、Ruby のパイプについて簡単に紹介します。

于 2013-05-14T10:13:50.400 に答える