Skip to content

Instantly share code, notes, and snippets.

@seki
Created November 8, 2012 12:35
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seki/4038546 to your computer and use it in GitHub Desktop.
Save seki/4038546 to your computer and use it in GitHub Desktop.
simple actor
require 'drip'
module Actor
class Ether
def initialize
@drip = Drip.new(nil)
Thread.current['channel'] = create_channel
end
def create_channel
key = @drip.write(Process.pid, 'spawn')
Channel.new(self, key)
end
def send(to, from, message)
@drip.write([from, message], to)
end
def receive(to, cursor)
cursor, value, = @drip.read_tag(cursor, to)[0]
return cursor, value
end
class Channel
def initialize(ether, key)
@ether = ether
@addr = key.to_s(36)
@cursor = key
end
attr_reader :addr
def spawn(*args)
ch = @ether.create_channel
Thread.new(ch, args) do |ch, args|
Thread.current['channel'] = ch
yield(*args)
end
ch.addr
end
def send(to, message)
@ether.send(to, @addr, message)
end
def receive
@cursor, value = @ether.receive(@addr, @cursor)
value
end
end
end
module_function
def init
Ether.new
end
def send(to, message)
Thread.current['channel'].send(to, message)
end
def receive
Thread.current['channel'].receive
end
def spawn(*args, &block)
Thread.current['channel'].spawn(*args, &block)
end
end
if __FILE__ == $0
Actor.init
echo_pid = Actor.spawn do
begin
while true
addr, message = Actor.receive
p message
end
rescue
p $!
end
end
Actor.send(echo_pid, 'hello')
sleep 1
def account
dict = Hash.new(0)
loop do
from, message = Actor.receive
case message[0]
when 'balance'
user = message[1]
Actor.send(from, ['balance', user, dict[user]])
when 'deposit'
_, user, money = message
dict[user] += money
Actor.send(from, ['balance', user, dict[user]])
end
end
end
acc = Actor.spawn do
account
end
10.times do |n|
2.times do
Actor.spawn(n, acc) do |uid, acc_pid|
Actor.send(acc_pid, ['balance', uid])
_, value = Actor.receive
p value
Actor.send(acc_pid, ['deposit', uid, 10])
_, value = Actor.receive
p value
end
end
end
sleep 10
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment