2013-05-14 17 views
5

Sto scrivendo un gioiello, in cui devo eseguire il fork di due processi che stanno avviando due server webrick. Voglio avviare questo server attraverso un metodo di classe da una classe base, perché dovrebbero essere attivi solo questi due server, non multipli. Durante il runtime, voglio chiamare alcuni metodi su questi due server per modificare le variabili.Condivisione variabile tramite processi ruby ​​

Il mio problema è che non posso accedere alle variabili di istanza dei fork, tramite un metodo di classe della classe base. Inoltre, non posso usare thread all'interno della mia classe base, perché sotto la cappa sto usando un'altra libreria che non è thread-safe. Quindi devo biforcare ogni server per il proprio processo.

Ho provato con variabili di classe, come @@server. Ma quando provo ad accedere a queste variabili attraverso la classe base, è nil. Ho letto che condividere le variabili di classe tra le forcelle non è possibile in Ruby, vero?

Quindi, c'è un altro modo per aggirare questo? Ho pensato di usare un singleton, ma non sono sicuro che questa sia l'idea migliore.

+0

[comunicazione tra processi] (http://en.wikipedia.org/wiki/Inter-process_communication) –

+0

Basta un collegamento è un po 'meno;) So comunicazione di processo inter, ma fare Devo davvero implementare un'interfaccia XML o gestire i protocoll specifici del sistema per raggiungere questo obiettivo? Ho pensato, forse c'è un "ruby-way" per fare questo – 23tux

+0

@ 23tux: i processi di Ruby sono separati, IPC è (al livello più alto) l'unico modo per risolvere il tuo problema. Ci sono un sacco di gemme di Ruby che potrebbero aiutare però. Probabilmente potresti semplicemente "Marshal" i tuoi dati su disco - tutto ciò che devi aggiungere è un po 'di blocco (per evitare letture/scritture parziali) e tenere d'occhio le prestazioni. Il prossimo potrebbe essere eseguire il marshalling su un 'memcached locale per evitare di toccare il disco. . . –

risposta

8

Quando si esegue il fork di un processo, la memoria dei processi figlio e padre viene separata, quindi non è possibile condividere le variabili direttamente tra loro. Quindi una classe singleton non funzionerà nel tuo caso.

La soluzione è IPC, rubino supporta sia pipes e sockets, che sono le due forme più utilizzate di IPC, almeno su * NIX. Ruby supporta anche distributed objects, se è necessaria un'interfaccia più trasparente.

Ciò che hai scelto dipende dal lavoro. Se sai che vuoi dividere i processi su più computer a un certo punto, vai con socket o drb. Se non vai con i tubi.

Here's a short introduction to pipes in Ruby

Problemi correlati