Skip to content

Instantly share code, notes, and snippets.

@pocke
Created September 18, 2020 09:48
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 pocke/b5d5e402001cab5c7d83f38f185bc38b to your computer and use it in GitHub Desktop.
Save pocke/b5d5e402001cab5c7d83f38f185bc38b to your computer and use it in GitHub Desktop.
Implement ractor by Thread
using Module.new {
refine ThreadGroup do
attr_accessor :fake_ractor
end
}
class FakeRactor
def initialize(*args, name: nil, &block)
@name = name
@incoming = Thread::Queue.new
@outgoing = Thread::Queue.new
Thread.new do
ThreadGroup.new.tap do |g|
g.add Thread.current
g.fake_ractor = self
end
instance_exec(*args, &block)
end
end
attr_reader :incoming
attr_reader :outgoing
def self.current
Thread.current.group.fake_ractor
end
def self.count
raise NotImplementedError
end
def self.select(*ractors, yield_value: true, move: false)
raise NotImplementedError
end
def self.recv
current.incoming.deq
end
def send(obj, move: false)
@incoming << obj
self
end
def self.yield obj, move: false
current.outgoing << obj
end
def take
@outgoing.deq
end
alias << send
def inspect
super
end
def name
@name
end
class RemoteError
attr_reader :ractor
end
def close_incoming
@incoming.close
end
def close_outgoing
@outgoing.close
end
def close
close_incoming
close_outgoing
end
end
r = FakeRactor.new do
FakeRactor.yield FakeRactor.recv
end
r.send 42
p r.take
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment