class ActorSystem(actors.internal.factory.ActorFactory): def __init__(self, system_dispatcher=None): """ The actor system is responsible for creating, configuring and stopping actors and dispatchers. Normally, only one system per application should be created. :param system_dispatcher: Override the dispatcher used by the system. This also acts as the default dispatcher for new actors. :type system_dispatcher: :class:`Dispatcher` """ self._system_dispatcher = Dispatcher(Executor()) \ if system_dispatcher is None else system_dispatcher self._dead_letters = _DeadLetterRef() self._terminate_promise = Promise() class Guardian(Actor): def __init__(me): me._logger = logging.getLogger(__name__) def receive(me, message): me._logger.warning("User receive called. This should not be happen.") def post_stop(me): self._terminate_promise.complete(None) self._guardian = InternalRef(actors.internal.cell.Cell(Guardian, dispatcher=self._system_dispatcher, system=self, parent=None)) self._guardian.send_system_message(Start) actors.internal.factory.ActorFactory.__init__(self, self, self._guardian) def terminate(self): self._guardian.send_system_message(Terminate) self._terminate_promise.future.get() @property def dead_letters(self): return self._dead_letters def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self.terminate()
def actor_of(self, cls=None, behaviour=None, dispatcher=None): if cls: factory = cls elif behaviour: factory = _actor_from_behaviour(behaviour) else: raise ValueError() if dispatcher is None: dispatcher = self._system._system_dispatcher from actors.internal.cell import Cell cell = Cell(factory, dispatcher=dispatcher, system=self._system, parent=self._supervisor) internal_ref = InternalRef(cell) self._supervisor.send_system_message(Supervise(internal_ref)) internal_ref.send_system_message(Start) return ActorRef(cell)