我想執行的一些方法與紅寶石的原子,根據http://en.wikipedia.org/wiki/Atomicity_(database_systems)寫一個原子操作
舉例來說,如果我有:
a = 30
b = 75
我希望能夠做一些事情,如:
atomic_operation do
a += 10
b -= 39
end
Ruby 1.9中是否有一個允許這樣的進程的本地模塊?如果可能的話,我想這樣做,而不使用插件。非常感謝!
我想執行的一些方法與紅寶石的原子,根據http://en.wikipedia.org/wiki/Atomicity_(database_systems)寫一個原子操作
舉例來說,如果我有:
a = 30
b = 75
我希望能夠做一些事情,如:
atomic_operation do
a += 10
b -= 39
end
Ruby 1.9中是否有一個允許這樣的進程的本地模塊?如果可能的話,我想這樣做,而不使用插件。非常感謝!
這實際上取決於你對作業的正確工具感興趣的範圍。如果您希望對數據庫執行原子操作,那麼數據庫驅動程序可能(如果它有任何好處/數據庫支持它)提供了一種使用數據庫事務來更新原子的方法。
如果您正在討論嘗試更新共享資源的多線程Ruby應用程序原子和線程安全,那麼Ruby提供了Mutex和ConditionVariable類來幫助您解決這個問題。 (更多信息:http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html)
還可以查看作爲Ruby標準庫一部分的'Monitor'和'MonitorMixin'類。對於STM來說,需要 – 2010-07-10 11:40:28
當你指向一篇關於數據庫的文章時,我猜你在問這個問題。
如果您使用的是Rails,請使用ActiveRecord的transaction
methods。
Account.transaction do
@alice.withdraw!(100)
@bob.deposit!(100)
end
如果在Rails之外使用,則必須使用數據庫驅動程序庫提供的內容。檢查Rails上的implementation of transaction以瞭解如何完成此操作。
你需要我的朋友是一個軟件事務內存。嘗試一下我在JRuby中玩過的STM實現(你需要簽署回購代碼,因爲我沒有將它打包發佈)。
還檢查出Ruby原子我正在對http://github.com/saivenkat/ruby-atomic工作。在MRI上爲您提供CAS類型的操作。這有點低,但會幫助你解決同樣的問題。我沒有寫MRI的交易內存,但與CAS的基礎設施,它不會很長:)
P.S Stackoverflow不讓我發佈多個鏈接,因爲我沒有使用它的系統很多。因此,在結帳的Codehaus的多元宇宙網站STM JRuby中
--Sai Venkat
+1。儘管沒有嘗試過圖書館。 – 2010-07-10 04:19:07
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
這將保證給予互斥#同步的塊順序運行。
最新文檔在這裏:https://ruby-doc.org/core-2.4.1/Thread/Mutex.html – ronen 2017-06-19 15:38:04
在https://github.com/headius/ruby-atomic和內部http://pragprog.com/book/jsthreads/working-with-ruby-看看線程 – 2014-03-22 14:02:32