2013-05-14 7 views
5

Ich schreibe ein Juwel, wo ich zwei Prozesse abzweigen, die zwei Webrick-Server starten. Ich möchte diese Server über eine Klassenmethode von einer Basisklasse aus starten, da nur diese beiden Server laufen sollten, nicht mehrere. Während der Laufzeit möchte ich einige Methoden auf diesen beiden Servern aufrufen, um Variablen zu ändern.Share Variable durch Ruby-Prozesse

Mein Problem ist, dass ich nicht über eine Klassenmethode der Basisklasse auf die Instanzvariablen der Forks zugreifen kann. Außerdem kann ich keine Threads innerhalb meiner Basisklasse verwenden, da ich unter der Haube eine andere Bibliothek verwende, die nicht Thread-sicher ist. Also muss ich jeden Server seinem eigenen Prozess zuordnen.

Ich versuchte es mit Klassenvariablen, wie @@server. Aber wenn ich versuche, auf diese Variablen über die Basisklasse zuzugreifen, ist es nil. Ich habe gelesen, dass das Teilen von Klassenvariablen unter Gabeln in Ruby nicht möglich ist, habe ich recht?

Also, gibt es einen anderen Weg? Ich dachte an einen Singleton, aber ich bin mir nicht sicher, ob das die beste Idee ist.

+0

[Inter-Prozess-Kommunikation] (http://en.wikipedia.org/wiki/Inter-process_communication) –

+0

Nur ein Link ist ein bisschen weniger;) Ich Interprozesskommunikation kennen, aber tun Ich muss wirklich eine XML-Schnittstelle implementieren oder mit systemspezifischen Protokollen arbeiten, um dies zu erreichen? Ich dachte, vielleicht gibt es einen "Ruby-Way", um dies zu tun – 23tux

+0

@ 23tux: Ruby-Prozesse sind getrennt, IPC ist (auf der obersten Ebene) der einzige Weg, um Ihr Problem zu lösen. Es gibt viele Ruby-Edelsteine, die jedoch helfen könnten. Sie könnten Ihre Daten wahrscheinlich einfach auf die Festplatte "marschieren" - alles, was Sie hinzufügen müssten, ist ein Locking (um partielle Lese-/Schreibvorgänge zu vermeiden), und behalten Sie die Leistung im Auge. Als nächstes kann das Marshalling zu einem lokalen 'Memcached' erfolgen, um das Berühren der Festplatte zu vermeiden. . . –

Antwort

8

Wenn Sie einen Prozess verzweigen, werden die Prozesse des untergeordneten Prozesses und des übergeordneten Prozesses getrennt, sodass Sie Variablen nicht direkt zwischen ihnen teilen können. Daher wird eine Singleton-Klasse in Ihrem Fall nicht funktionieren.

Die Lösung ist IPC unterstützt Rubin sowohl pipes und sockets, der die beiden am häufigsten verwendeten Formen von IPC sind, zumindest auf * NIX. Ruby unterstützt auch distributed objects, wenn Sie eine transparentere Schnittstelle benötigen.

Was Sie wählen, hängt von der Aufgabe ab. Wenn Sie wissen, dass Sie Ihre Prozesse irgendwann auf mehrere Computer aufteilen wollen, gehen Sie mit Sockets oder drb. Wenn nicht mit Rohren gehen.

Here's a short introduction to pipes in Ruby