Synchronizing actors?

49 views
Skip to first unread message

Artūras Šlajus

unread,
Jan 27, 2012, 2:53:06 AM1/27/12
to cellulo...@googlegroups.com
Hello,

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?

Tony Arcieri

unread,
Jan 27, 2012, 2:53:25 PM1/27/12
to cellulo...@googlegroups.com
Arturas has sent me a patch for this:


It should be appearing soon as Celluloid#exclusive

This has been a planned feature, however this was the first request for it.

2012/1/26 Artūras Šlajus <arturas...@gmail.com>



--
Tony Arcieri

Reply all
Reply to author
Forward
0 new messages