Написать атомарную операцию - PullRequest
5 голосов
/ 08 июля 2010

Я хотел бы выполнить некоторые методы атомарности с Ruby, в соответствии с http://en.wikipedia.org/wiki/Atomicity_(database_systems)

Например, если у меня есть:

a = 30
b = 75

Я хотел бы иметь возможность сделать что-токак:

atomic_operation do
  a += 10
  b -= 39
end

Есть ли в Ruby 1.9 встроенный модуль, который разрешает такой процесс?Если возможно, я бы хотел сделать это без использования плагина.Большое спасибо!

Ответы [ 5 ]

7 голосов
/ 08 июля 2010

Это действительно зависит от области, в которой вы заинтересованы, как от правильных инструментов для работы. Если вы хотите выполнить элементарную операцию с базой данных, то драйвер базы данных, вероятно, (если это хорошо / база данных ее поддерживает) предложит способ использовать транзакцию базы данных, чтобы сделать обновления атомарными.

Если вы говорите о многопоточном приложении Ruby, которое пытается сделать обновления общих ресурсов атомарными и поточно-ориентированными, тогда Ruby предоставляет классы Mutex и ConditionVariable, чтобы помочь вам в этом. (Подробнее: http://ruby -doc.org / docs / ProgrammingRuby / html / tut_threads.html )

6 голосов
/ 15 августа 2011

Класс Mutex доступен во время выполнения 1.9 (и require('thread') в 1.8) и позволяет блокировать операции в контексте.

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

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

Это гарантирует, что блок передан Mutex #синхронизация запускается последовательно.

Официальный документ здесь: http://rubydoc.info/stdlib/core/1.9.2/Mutex

5 голосов
/ 08 июля 2010

Когда вы указываете на статью о базах данных, я предполагаю, что вы спрашиваете в этом контексте.

Если вы используете Rails, вы используете transaction методы из ActiveRecord .

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

При использовании вне Rails вы должны работать с тем, что предоставляет библиотека драйвера базы данных. Проверьте реализацию транзакции на Rails, чтобы получить представление о том, как это можно сделать.

2 голосов
/ 08 июля 2010

Что вам нужно, мой друг, это программное обеспечение транзакционной памяти.Попробуйте реализацию STM, с которой я играл в JRuby (вам нужно получить код в репозитории, так как я не упаковал его для релиза).

Также ознакомьтесь с Ruby atomic, над которым я работаю http://github.com/saivenkat/ruby-atomic. Дает вам тип операций CAS на МРТ.Это немного ниже уровня, но поможет вам с той же проблемой.Я не написал Transactional Memory для MRI, но с инфраструктурой CAS она не будет длинной:)

PS Stackoverflow не позволяет мне публиковать более одной ссылки, так как я не использовал ее систему.много.Так что загляните на мультивселенную площадку в Codehaus для STM в JRuby

- Sai Venkat

0 голосов
/ 10 июля 2010

Вы смотрели на камень "Transaction Simple"?

Я думаю, что это будет соответствовать вашей цели

http://rubyforge.org/projects/trans-simple

...