2010-07-07 11 views
5

vorrei eseguire alcuni metodi atomicità con Ruby, secondo http://en.wikipedia.org/wiki/Atomicity_(database_systems)Scrivere un'operazione atomica

Per esempio, se ho:

a = 30 
b = 75 

Vorrei essere in grado di fare qualcosa di simile:

atomic_operation do 
    a += 10 
    b -= 39 
end 

Esiste un modulo nativo in Ruby 1.9 che consente tale processo? Se possibile, mi piacerebbe farlo senza usare un plugin. Grazie molto!

+0

Date un'occhiata a https://github.com/headius/ruby-atomic e dentro http://pragprog.com/book/jsthreads/working-with-ruby- thread –

risposta

7

Dipende molto dalla portata che ti interessa per gli strumenti giusti per il lavoro. Se si sta cercando di eseguire un'operazione atomica su un database, il driver del database probabilmente (se è valido/il database lo supporta) offre un modo per utilizzare una transazione di database per rendere gli aggiornamenti atomici.

Se si sta parlando di un'applicazione Ruby a più thread che tenta di rendere gli aggiornamenti delle risorse condivise atomici e sicuri per i thread, Ruby fornisce le classi Mutex e ConditionVariable per fornire assistenza in tal senso. (Ulteriori informazioni: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html)

+0

Controllate anche le classi 'Monitor' e' MonitorMixin' che fanno parte delle librerie standard Ruby. –

4

Come si fa riferimento a un articolo sui database, immagino si stia chiedendo in questo contesto.

Se si utilizza Rails, si utilizza transactionmethods di ActiveRecord.

Account.transaction do 
    @alice.withdraw!(100) 
    @bob.deposit!(100) 
end 

In caso di utilizzo al di fuori di Rails, si deve lavorare con ciò che la libreria di driver di database fornisce. Controlla il implementation of transaction su Rails per avere un'idea di come può essere fatto.

2

Quello che ti serve amico è una memoria transazionale del software. Prova l'implementazione STM con cui ho giocato in JRuby (devi eseguire il checkout del codice in repo perché non l'ho impacchettato per il rilascio).

Controllare anche Ruby atomico Sto lavorando su http://github.com/saivenkat/ruby-atomic. Ti dà il tipo CAS di operazioni su MRI. Questo è un po 'più basso, ma ti aiuterà con lo stesso problema. Non ho scritto Transactional Memory per MRI, ma con l'infrastruttura CAS non sarà lungo :)

P.S Stackoverflow non mi permette di pubblicare più di un collegamento perché non ho usato molto il suo sistema. Così checkout il sito multiverso in Codehaus per STM in JRuby

--Sai Venkat

+0

+1 per STM è ciò di cui l'OP ha bisogno. Non ho provato la libreria però. –

6

La classe Mutex è disponibile in runtime 1.9 (e require('thread') in 1.8) e permette di bloccare le operazioni in un contesto.

# Typically defined in the object initializer 
@lock = Mutex.new 

# Then in your code 
@lock.synchronize do 
    a += 10 
    b -= 39 
end 

Ciò garantirà che il blocco assegnato a Mutex # synchronize sia eseguito in modo sequenziale.

doc ufficiale è qui: http://rubydoc.info/stdlib/core/1.9.2/Mutex

+0

L'ultimo documento è qui: https://ruby-doc.org/core-2.4.1/Thread/Mutex.html – ronen