2010-07-07 8 views
5

me gustaría ejecutar algunos métodos atomicidad con Ruby, de acuerdo con http://en.wikipedia.org/wiki/Atomicity_(database_systems)Escribir una operación atómica

Por ejemplo, si tengo:

a = 30 
b = 75 

me gustaría ser capaz de hacer algo como:

atomic_operation do 
    a += 10 
    b -= 39 
end 

¿Hay un módulo nativo en Ruby 1.9 que permita dicho proceso? Si es posible, me gustaría hacerlo sin usar un complemento. ¡Muchas gracias!

+0

Tome un vistazo a https://github.com/headius/ruby-atomic y en el interior http://pragprog.com/book/jsthreads/working-with-ruby- threads –

Respuesta

7

Realmente depende del alcance que le interese en cuanto a las herramientas adecuadas para el trabajo. Si está buscando realizar una operación atómica en una base de datos, entonces el controlador de la base de datos probablemente (si es bueno/la base de datos lo admite) ofrecerá una forma de utilizar una transacción de base de datos para realizar actualizaciones atómicas.

Si está hablando de una aplicación Ruby de subprocesos múltiples que intenta hacer actualizaciones a recursos compartidos atómicos y seguros para subprocesos, entonces Ruby proporciona las clases Mutex y ConditionVariable para ayudarlo en ese sentido. (Más información: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html)

+0

También consulte las clases 'Monitor' y' MonitorMixin' que forman parte de las bibliotecas estándar de Ruby. –

4

Como usted señala un artículo sobre bases de datos, supongo que usted está preguntando en este contexto.

Si está utilizando Rails, use transactionmethods de ActiveRecord.

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

Si utiliza fuera de Rails, tiene que trabajar con lo que proporciona la biblioteca del controlador de la base de datos. Consulte implementation of transaction en Rails para tener una idea de cómo se puede hacer.

2

Lo que necesita mi amigo es una memoria transaccional de software. Pruebe la implementación de STM con la que he estado jugando en JRuby (Debe verificar el código en el repositorio ya que no lo he empaquetado para el lanzamiento).

También echa un vistazo a Ruby atomic Estoy trabajando en http://github.com/saivenkat/ruby-atomic. Le da el tipo de operaciones CAS en MRI. Este es un nivel un poco más bajo, pero te ayudará con el mismo problema. No he escrito Transactional Memory para MRI uno, pero con la infraestructura CAS no será largo :)

P.S Stackoverflow no me deja publicar más de un enlace ya que no usé mucho su sistema. Así que la comprobación del sitio multiverso en Codehaus para STM en JRuby

--Sai Venkat

+0

+1 para que STM sea lo que el OP necesita. Aunque no he probado la biblioteca. –

6

La clase de objeto mutex está disponible en el 1.9 tiempo de ejecución (y require('thread') en 1.8) y le permite bloquear las operaciones en un contexto.

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

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

Esto le garantizará que el bloque dado a Mutex # synchronize se ejecuta secuencialmente.

documento oficial está aquí: http://rubydoc.info/stdlib/core/1.9.2/Mutex

+0

El último documento está aquí: https://ruby-doc.org/core-2.4.1/Thread/Mutex.html – ronen

Cuestiones relacionadas