Module: Concurrent::Postable

Included in:
Actor
Defined in:
lib/concurrent/actor/postable.rb

Instance Method Summary collapse

Instance Method Details

#<<(message) ⇒ Object



45
46
47
48
# File 'lib/concurrent/actor/postable.rb', line 45

def <<(message)
  post(*message)
  self
end

#forward(receiver, *message) ⇒ Object

Deprecated.

Actor is being replaced with a completely new framework prior to v1.0.0

Raises:

  • (ArgumentError)


79
80
81
82
83
84
# File 'lib/concurrent/actor/postable.rb', line 79

def forward(receiver, *message)
  raise ArgumentError.new('empty message') if message.empty?
  return false unless ready?
  queue.push(Package.new(message, receiver))
  queue.length
end

#post(*message) ⇒ Object

Sends a message to and returns. It’s a fire-and-forget interaction.

Examples:

class EchoActor < Concurrent::Actor
  def act(*message)
    p message
  end
end

echo = EchoActor.new
echo.run!

echo.post("Don't panic") #=> true
#=> ["Don't panic"]

echo.post(1, 2, 3, 4, 5) #=> true
#=> [1, 2, 3, 4, 5]

echo << "There's a frood who really knows where his towel is." #=> #<EchoActor:0x007fc8012b8448...
#=> ["There's a frood who really knows where his towel is."]

Parameters:

  • message (Array)

    one or more arguments representing a single message to be sent to the receiver.

Returns:

  • (Object)

    false when the message cannot be queued else the number of messages in the queue after this message has been post

Raises:

  • ArgumentError when the message is empty



38
39
40
41
42
43
# File 'lib/concurrent/actor/postable.rb', line 38

def post(*message)
  raise ArgumentError.new('empty message') if message.empty?
  return false unless ready?
  queue.push(Package.new(message))
  true
end

#post!(seconds, *message) ⇒ Object

Raises:

  • (ArgumentError)


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/concurrent/actor/postable.rb', line 58

def post!(seconds, *message)
  raise ArgumentError.new('empty message') if message.empty?
  raise Concurrent::LifecycleError unless ready?
  raise Concurrent::TimeoutError if seconds.to_f <= 0.0
  event = Event.new
  cback = Queue.new
  queue.push(Package.new(message, cback, event))
  if event.wait(seconds)
    result = cback.pop
    if result.is_a?(Exception)
      raise result
    else
      return result
    end
  else
    event.set # attempt to cancel
    raise Concurrent::TimeoutError
  end
end

#post?(*message) ⇒ Boolean

Returns:

  • (Boolean)

Raises:

  • (ArgumentError)


50
51
52
53
54
55
56
# File 'lib/concurrent/actor/postable.rb', line 50

def post?(*message)
  raise ArgumentError.new('empty message') if message.empty?
  return nil unless ready?
  ivar = IVar.new
  queue.push(Package.new(message, ivar))
  ivar
end

#ready?Boolean

Deprecated.

Actor is being replaced with a completely new framework prior to v1.0.0

Returns:

  • (Boolean)


87
88
89
90
91
92
93
# File 'lib/concurrent/actor/postable.rb', line 87

def ready?
  if self.respond_to?(:running?) && ! running?
    false
  else
    true
  end
end