I have a need to sync two actors. Work by actor 1 cannot be done until
work by actor 2 is finished. I was playing with such solution:
require 'celluloid'
class Logger
include Celluloid
def initialize; @storage = []; end
def log(message); @storage << message; end
def get; @storage.dup; end
end
class Worker
include Celluloid
DATA = :data
WAIT = :wait
def initialize(id, logger)
@name = :"worker_#{id}"
@logger = logger
end
def message(kind, data)
case kind
when DATA
log "Starting work for #{data} seconds."
Kernel.sleep data
log "Done working."
when WAIT
id, worker = data
name = :"worker_#{id}"
log "Waiting until #{name} is done."
worker.sync(@name)
log "#{name} is done!"
end
end
def sync(name)
log "Sync requested by #{name}."
end
private
def log(message)
@logger.log!("%s [%s] %s" % [Time.now.strftime("%H:%M:%S"), @name,
message])
end
end
puts "Starting simulation"
logger = Logger.new
w1 = Worker.new(1, logger)
w2 = Worker.new(2, logger)
w1.message!(Worker::DATA, 1)
w2.message!(Worker::DATA, 3)
w1.message!(Worker::WAIT, [2, w2])
w1.message!(Worker::DATA, 1)
#w2.message!(Worker::DATA, 2)
sleep 6
logger.get.each do |message|
puts message
end
however, running it gets me:
arturas@zeus:~/work/spacegame/server$ jruby --1.9 ctest.rb
Starting simulation
09:51:34 [worker_1] Starting work for 1 seconds.
09:51:34 [worker_2] Starting work for 3 seconds.
09:51:35 [worker_1] Done working.
09:51:35 [worker_1] Waiting until worker_2 is done.
09:51:35 [worker_1] Starting work for 1 seconds.
09:51:36 [worker_1] Done working.
09:51:37 [worker_2] Done working.
09:51:37 [worker_2] Sync requested by worker_1.
09:51:37 [worker_1] worker_2 is done!
As where I'd like to see something more in lines of:
arturas@zeus:~/work/spacegame/server$ jruby --1.9 ctest.rb
Starting simulation
09:51:34 [worker_1] Starting work for 1 seconds.
09:51:34 [worker_2] Starting work for 3 seconds.
09:51:35 [worker_1] Done working.
09:51:35 [worker_1] Waiting until worker_2 is done.
09:51:37 [worker_2] Done working.
09:51:37 [worker_2] Sync requested by worker_1.
09:51:37 [worker_1] worker_2 is done!
09:51:37 [worker_1] Starting work for 1 seconds.
09:51:38 [worker_1] Done working.
Is there a way to sync them?