Skip to content

Instantly share code, notes, and snippets.

@regularfry
Created May 21, 2009 15:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save regularfry/115512 to your computer and use it in GitHub Desktop.
Save regularfry/115512 to your computer and use it in GitHub Desktop.
require 'thread'
class Actor
def initialize(send_queue, recv_queue)
@send_queue = send_queue
@recv_queue = recv_queue
end
def send(sym, *args)
@send_queue.push([sym,*args])
end
def recv
return @recv_queue.pop
end
def die
Thread.current.kill
end
end
class Master < Actor
attr_accessor :results
def initialize(send_queue, recv_queue, slave_count)
super(send_queue, recv_queue)
@slave_count = slave_count
@threads = (0..slave_count).map do
Thread.new do
slave = Slave.new(@recv_queue, @send_queue)
slave.loop
end
end
end
def kick_off
('a'..'z').each do |x|
send(:puts, x)
end
@slave_count.times do
send(:die)
end
end
def wait_for_results
@results = (0..@slave_count).map do
self.recv
end
end
end
class Slave < Actor
def loop
while true do
sym, *args = self.recv
result = self.__send__(sym,*args)
self.send(result)
end
end
def puts(str)
Kernel.puts str
return str.succ
end
end
send_queue, recv_queue = [Queue.new, Queue.new]
master = Master.new(send_queue, recv_queue, 20)
master.kick_off
master.wait_for_results
p master.results
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment