Rubino - Oggetti immutabili
-
03-07-2019 - |
Domanda
Ho un'app altamente multithread scritta in Ruby che condivide alcune variabili di istanza. Le scritture su queste variabili sono rare (1%) mentre le letture sono molto comuni (99%). Qual è il modo migliore (secondo te o nella maniera idiomatica di Ruby) per garantire che questi thread vedano sempre i valori più aggiornati coinvolti? Ecco alcune idee finora che ho avuto ( anche se mi piacerebbe il tuo contributo prima di revisionarlo):
- Avere un lucchetto che verrà maggiormente utilizzato prima di leggere o scrivere una di queste variabili (da Concorrenza Java in pratica ). Il rovescio della medaglia di questo è che inserisce molti blocchi
sincronizzare
nel mio codice e non vedo un modo semplice per evitarlo. - Usa il metodo
freeze
di Ruby (vedi qui ), sebbene sembra ugualmente ingombrante e non mi offre alcun vantaggio di sincronizzazione offerto dalla prima opzione.
Queste opzioni sembrano entrambe abbastanza simili, ma speriamo che chiunque abbia un'idea migliore (o possa discutere bene per una di queste idee). Andrei anche bene a rendere immutabili gli oggetti in modo che non siano corrotti o alterati nel mezzo di un'operazione, ma non conosco Ruby abbastanza bene da effettuare la chiamata da solo e questa domanda sembra sostenere che gli oggetti sono altamente mutabili.
Soluzione
L'uso del blocco è il modo più appropriato per farlo. Puoi vedere questa presentazione di Jim Weirich sull'argomento: Ciò che tutti i rubyisti dovrebbero sapere sul threading .
Inoltre, il congelamento di un oggetto non ti aiuterà qui poiché desideri modificare queste variabili. Congelandoli sul posto significa che non saranno applicabili ulteriori modifiche a questi (e quindi il tuo 1% di scritture non funzionerà).
Altri suggerimenti
Non l'ho usato da solo, ma potresti voler dare un'occhiata a Flusso di dati . Fa scrivere tutte le variabili una volta.
Il blocco lettori-scrittore è un problema comune con una soluzione ben definita:
e ci sono molte implementazioni di esso:
Pattern di blocco della scrittura
Non vuoi mettere un lucchetto su ogni lettura / scrittura
Devi usare un Mutex per sincronizzare l'accesso allo stato condiviso. Non c'è davvero modo di evitare di farlo.
Sui moderni computer multi-core non è possibile fare ipotesi su come si accederà alla memoria o su come gli accessi alla memoria interagiranno con la memorizzazione nella cache.