Class: Concurrent::Actor::Reference

Inherits:
Object
  • Object
show all
Includes:
PublicDelegations, TypeCheck
Defined in:
lib/concurrent-ruby-edge/concurrent/actor/reference.rb

Overview

Reference is public interface of Actor instances. It is used for sending messages and can be freely passed around the application. It also provides some basic information about the actor, see PublicDelegations.

AdHoc.spawn('printer') { -> message { puts message } }
# => #<Concurrent::Actor::Reference:0x7fd0d2883218 /printer (Concurrent::Actor::Utils::AdHoc)>
#                                   ^object_id     ^path     ^context class

Instance Method Summary collapse

Instance Method Details

#==(other) ⇒ undocumented



95
96
97
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 95

def ==(other)
  Type? other, self.class and other.send(:core) == core
end

#ask(message, future = Concurrent::Promises.resolvable_future) ⇒ Promises::Future Also known as: ask_op

Note:

it's a good practice to use #tell whenever possible. Results can be sent back with other messages. Ask should be used only for testing and when it returns very shortly. It can lead to deadlock if all threads in global_io_executor will block on while asking. It's fine to use it form outside of actors and global_io_executor.

Returns supplied future.

Examples:

adder = AdHoc.spawn('adder') { -> message { message + 1 } }
adder.ask(1).value # => 2
adder.ask(nil).wait.reason # => #<NoMethodError: undefined method `+' for nil:NilClass>

Parameters:

  • message (Object)
  • future (Promises::Future) (defaults to: Concurrent::Promises.resolvable_future)

    to be fulfilled be message's processing result

Returns:



49
50
51
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 49

def ask(message, future = Concurrent::Promises.resolvable_future)
  message message, future
end

#ask!(message, future = Concurrent::Promises.resolvable_future) ⇒ Object

Note:

it's a good practice to use #tell whenever possible. Results can be sent back with other messages. Ask should be used only for testing and when it returns very shortly. It can lead to deadlock if all threads in global_io_executor will block on while asking. It's fine to use it form outside of actors and global_io_executor.

Sends the message synchronously and blocks until the message is processed. Raises on error.

Examples:

adder = AdHoc.spawn('adder') { -> message { message + 1 } }
adder.ask!(1) # => 2

Parameters:

  • message (Object)
  • future (Promises::Future) (defaults to: Concurrent::Promises.resolvable_future)

    to be fulfilled be message's processing result

Returns:

  • (Object)

    message's processing result

Raises:

  • (Exception)

    future.reason if future is #rejected?



70
71
72
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 70

def ask!(message, future = Concurrent::Promises.resolvable_future)
  ask(message, future).value!
end

#dead_letter_routingundocumented



85
86
87
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 85

def dead_letter_routing
  core.dead_letter_routing
end

#map(messages) ⇒ undocumented



74
75
76
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 74

def map(messages)
  messages.map { |m| self.ask(m) }
end

#message(message, future = nil) ⇒ undocumented

behaves as #tell when no future and as #ask when future



79
80
81
82
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 79

def message(message, future = nil)
  core.on_envelope Envelope.new(message, future, Actor.current || Thread.current, self)
  return future ? future.with_hidden_resolvable : self
end

#tell(message) ⇒ Reference Also known as: <<

Sends the message asynchronously to the actor and immediately returns self (the reference) allowing to chain message telling.

Examples:

printer = AdHoc.spawn('printer') { -> message { puts message } }
printer.tell('ping').tell('pong')
printer << 'ping' << 'pong'
# => 'ping'\n'pong'\n'ping'\n'pong'\n

Parameters:

  • message (Object)

Returns:



32
33
34
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 32

def tell(message)
  message message, nil
end

#to_sundocumented Also known as: inspect



89
90
91
# File 'lib/concurrent-ruby-edge/concurrent/actor/reference.rb', line 89

def to_s
  format '%s %s (%s)>', super[0..-2], path, actor_class
end

#Child!(value, *types) ⇒ undocumented Originally defined in module TypeCheck

#Child?(value, *types) ⇒ Boolean Originally defined in module TypeCheck

Returns:

  • (Boolean)

#context_classundocumented Also known as: actor_class Originally defined in module PublicDelegations

See Also:

#executorundocumented Originally defined in module PublicDelegations

See Also:

#Match!(value, *types) ⇒ undocumented Originally defined in module TypeCheck

#Match?(value, *types) ⇒ Boolean Originally defined in module TypeCheck

Returns:

  • (Boolean)

#nameundocumented Originally defined in module PublicDelegations

See Also:

#parentundocumented Originally defined in module PublicDelegations

See Also:

#pathundocumented Originally defined in module PublicDelegations

See Also:

#referenceundocumented Also known as: ref Originally defined in module PublicDelegations

See Also:

#Type!(value, *types) ⇒ undocumented Originally defined in module TypeCheck

#Type?(value, *types) ⇒ Boolean Originally defined in module TypeCheck

Returns:

  • (Boolean)