class Celluloid::Future
Celluloid::Future objects allow methods and blocks to run in the background, their values requested later
Attributes
address[R]
Public Class Methods
new(*args, &block)
click to toggle source
Calls superclass method
# File lib/celluloid/future.rb, line 7 def self.new(*args, &block) return super unless block future = new # task = Thread.current[:celluloid_task] # actor = Thread.current[:celluloid_actor] Internals::ThreadHandle.new(Celluloid.actor_system, :future) do begin # Thread.current[:celluloid_task] = task # Thread.current[:celluloid_actor] = actor call = Call::Sync.new(future, :call, args) call.dispatch(block) rescue # Exceptions in blocks will get raised when the value is retrieved end end future end
new(&block)
click to toggle source
# File lib/celluloid/future.rb, line 28 def initialize(&block) @address = Celluloid.uuid @mutex = Mutex.new @ready = false @result = nil @forwards = nil @cancelled = false if block @call = Call::Sync.new(self, :call, args) Celluloid.internal_pool.get do begin @call.dispatch(block) rescue # Exceptions in blocks will get raised when the value is retrieved end end else @call = nil end end
Public Instance Methods
cancel(error)
click to toggle source
# File lib/celluloid/future.rb, line 121 def cancel(error) response = ErrorResponse.new(@call, error) signal response @mutex.synchronize do @cancelled = true end end
execute(receiver, method, args, block)
click to toggle source
Execute the given method in future context
# File lib/celluloid/future.rb, line 51 def execute(receiver, method, args, block) @mutex.synchronize do fail "already calling" if @call @call = Call::Sync.new(self, method, args, block) end receiver << @call end
ready?()
click to toggle source
Check if this future has a value yet
# File lib/celluloid/future.rb, line 61 def ready? @ready end
signal(value)
click to toggle source
Signal this future with the given result value
# File lib/celluloid/future.rb, line 104 def signal(value) return if @cancelled result = Result.new(value, self) @mutex.synchronize do fail "the future has already happened!" if @ready if @forwards @forwards.is_a?(Array) ? @forwards.each { |f| f << result } : @forwards << result end @result = result @ready = true end end
Also aliased as: <<
value(timeout = nil)
click to toggle source
Obtain the value for this Future
# File lib/celluloid/future.rb, line 66 def value(timeout = nil) ready = result = nil begin @mutex.lock if @ready ready = true result = @result else case @forwards when Array @forwards << Celluloid.mailbox when NilClass @forwards = Celluloid.mailbox else @forwards = [@forwards, Celluloid.mailbox] end end ensure @mutex.unlock end unless ready result = Celluloid.receive(timeout) do |msg| msg.is_a?(Future::Result) && msg.future == self end end if result (result.respond_to?(:value)) ? result.value : result else fail TimedOut, "Timed out" end end
Also aliased as: call