我正在研究多进程文件处理脚本。在尝试了线程/分叉之后,我发现了 IPC(管道/套接字)以及最后但并非最不重要的 DRb。它似乎是所有选项中功能最强大且相对用户友好的。
我正在阅读关于线程安全的文章: https ://en.wikibooks.org/wiki/Ruby_Programming/Standard_Library/DRb
但是当我尝试他们的示例时,我似乎没有得到线程安全的结果。
线程安全服务器:
require 'drb'
require 'thread'
class MyStore
def initialize
@hash = { :counter=>0 }
@mutex = Mutex.new
end
def inc(elem)
@mutex.synchronize do
self[elem] = self[elem].succ
end
end
def [](elem)
@hash[elem]
end
def []=(elem,value)
@hash[elem] = value
end
end
mystore = MyStore.new
DRb.start_service('druby://localhost:9000', mystore)
DRb.thread.join
客户:
require 'drb'
obj = DRbObject.new(nil, 'druby://localhost:9000')
STDOUT.sync = true
100.times do
puts obj[:counter]
obj.inc(:counter)
obj[:lastaccess] = Time.now
end
我首先在后台运行服务器代码。我后来两次启动客户端代码:
ruby client.rb > 1.txt & ; ruby client.rb > 2.txt
现在我希望在文件 1.txt 和 2.txt 中看到不同的数字,因为每个客户端都控制了计数器并且在执行增量之前不会释放它。
我错过了什么明显的问题?:)