我想执行的一些方法与红宝石的原子,根据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