Я работаю над скриптом обработки многопроцессорных файлов. После опроса нитей/форкинга я узнал о IPC (pipe/socket) и, наконец, DRb. Кажется, что это самый способный из всех вариантов и относительно удобный.Ruby DRb - Thread-Safety
Я читал в о безопасности потока на: 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, поскольку каждый клиент берет на себя управление счетчиком и не освобождает его, пока он выполнил приращение.
Какая очевидная проблема мне не хватает? :)
Если мой ответ привел к разрешению, вы могли бы принять его :). Ваш хороший пример того, как вы можете изменить код, чтобы он был потокобезопасным, но я считаю, что мое - более общее объяснение проблемы. –
Все еще знакомы с пользовательским интерфейсом. Принял ваш ответ :) –