In Ruby, cambia globale nel blocco sicuro thread

1

In Ruby, ho un caso d'uso per alcune opzioni di configurazione comuni, ad es. NOOP, TRACE, SILENT. In questo momento sto usando vars locali invece che globali e li faccio passare in giro dappertutto ed è un dolore. Sono perfettamente contento di utilizzare globals per questi, se potessi eseguire un blocco in cui le globali possono essere temporaneamente modificate e quindi ripristinate. per es.

 global_configure(:TRACE=>true) do
   ...
 end

Ma come posso rendere sicuro quel thread di codice, in modo che altri thread non possano cambiarlo globalmente?

    
posta trans 17.01.2014 - 22:53
fonte

2 risposte

1

Penso che la risposta migliore sia: non farlo.

Non stai dando molto sulle tue specifiche, ma una domanda chiave è: perché ci sono altri thread?

Se gli altri thread sono richieste simultanee che capita di condividere il codice e alcuni dati globali, in realtà non si desidera attivare arbitrariamente la traccia per una richiesta completamente diversa.

Se gli altri thread fanno parte della richiesta corrente (ad esempio l'elaborazione in background), si desidera garantire l'uniformità, quindi è necessario impostare lo stato globale in un punto in cui si controlla lo stato del thread, preferibilmente quando gli altri thread sono inattivi .

In generale, questo tipo di problema è risolto meglio con una classe di configurazione che si inserisce nella richiesta / thread all'avvio, quindi ognuno ha il suo.

Con maggiori dettagli sul tuo ambiente potrebbe essere possibile una risposta migliore.

    
risposta data 19.01.2014 - 10:47
fonte
0

Clojure ha una soluzione con variabili dinamiche e il modulo binding , che consente di impostare una variabile globale su un valore solo per l'esecuzione di un blocco di codice, senza influenzare altri thread che potrebbero utilizzare tale variabile.

Ruby non ha quella funzionalità integrata, ma ho trovato una gemma che implementa qualcosa di simile: link . Lo usi in questo modo:

LSpace.with(:TRACE=>true) do
    # ... code code code
    puts LSpace[:TRACE]
    # ... code code code
end

Una delle principali differenze tra l'implementazione di Clojure e la gemma di Ruby da tenere a mente è che nella versione Clojure se si genera un nuovo thread all'interno del blocco in cui la variabile è vincolata, il nuovo thread otterrà il valore limitato, e nella versione di Ruby non lo farebbe, quindi se devi fare affidamento su tale funzionalità, è meglio passare queste opzioni di configurazione come argomenti (o come campi dei membri).

    
risposta data 19.01.2014 - 12:37
fonte

Leggi altre domande sui tag