def request(message)
      @mtx.synchronize do
        raise DeadActorError if not @running
        message = Message.coerce(message)
        raise ArgumentError, "use #terminate" if TERM == message[0]
        message.send_to(self)
        Message.receive_from(self)
      end
    rescue IO::EAGAINWaitWritable
      # same as in #<<
      retry
    end
def request(message)
      @mtx.synchronize do
        raise DeadActorError if not @running
        message = Message.coerce(message)
        raise ArgumentError, "use #terminate" if TERM == message[0]
        message.send_to(self)
        Message.receive_from(self)
      end
    rescue IO::EAGAINWaitWritable
      # same as in #<<
      retry
    end
Same as {#<<}, but also waits for a response from the actor and returns
 it.
 @param message [Message] the request to the actor
 @return [Message] the actor's response
 @raise [ArgumentError] if the message is "$TERM" (use {#terminate})