Exemple #1
0
class ActorRunner(Service):
    def __init__(
        self,
        actor_cls,
        init_params={},
        initial_message=_EMPTY,
        nodeid=None,
        enable_relay=False,
        name=None,
        keep_running=False,
    ):
        if nodeid:
            _validate_nodeid(nodeid)
        self._init_params = init_params
        self._initial_message = initial_message
        self._actor_cls = actor_cls
        self._wrapper = None
        self._nodeid = nodeid
        self._enable_relay = enable_relay
        self._name = name
        self._keep_running = keep_running

    def startService(self):
        actor_path = self._actor_path = "%s.%s" % (self._actor_cls.__module__, self._actor_cls.__name__)

        def start_actor():
            # if self._nodeid:
            #     log("Setting up remoting; node ID = %s" % (self._nodeid,))
            # else:
            #     log("No remoting requested; specify `--remoting/-r <nodeid>` (nodeid=host:port) to set up remoting")

            self.node = Node(
                nid=self._nodeid, enable_remoting=True if self._nodeid else False, enable_relay=self._enable_relay
            )

            try:
                self._wrapper = self.node.spawn(
                    Wrapper.using(
                        self._actor_cls.using(**self._init_params), spawn_at=self._name, keep_running=self._keep_running
                    ),
                    name="_runner",
                )
            except Exception:
                panic("Failed to start wrapper for %s\n" % (actor_path,), Failure().getTraceback())
                reactor.stop()
            else:
                if self._initial_message is not _EMPTY:
                    self._wrapper << ("_forward", self._initial_message)

        # dbg("Running: %s%s" % (actor_path, " @ /%s" % (self._name,) if self._name else ''))
        spawn(start_actor).link_exception(lambda _: reactor.stop())

    def stopService(self):
        if getattr(self, "node", None):
            self.node.stop()

    def __repr__(self):
        return "<ActorRunner>"
Exemple #2
0
class ActorRunner(Service):
    def __init__(self,
                 actor_cls,
                 init_params={},
                 initial_message=_EMPTY,
                 nodeid=None,
                 enable_relay=False,
                 name=None,
                 keep_running=False):
        if nodeid:
            _validate_nodeid(nodeid)
        self._init_params = init_params
        self._initial_message = initial_message
        self._actor_cls = actor_cls
        self._wrapper = None
        self._nodeid = nodeid
        self._enable_relay = enable_relay
        self._name = name
        self._keep_running = keep_running

    def startService(self):
        actor_path = self._actor_path = '%s.%s' % (self._actor_cls.__module__,
                                                   self._actor_cls.__name__)

        def start_actor():
            # if self._nodeid:
            #     log("Setting up remoting; node ID = %s" % (self._nodeid,))
            # else:
            #     log("No remoting requested; specify `--remoting/-r <nodeid>` (nodeid=host:port) to set up remoting")

            self.node = Node(nid=self._nodeid,
                             enable_remoting=True if self._nodeid else False,
                             enable_relay=self._enable_relay)

            try:
                self._wrapper = self.node.spawn(Wrapper.using(
                    self._actor_cls.using(**self._init_params),
                    spawn_at=self._name,
                    keep_running=self._keep_running),
                                                name='_runner')
            except Exception:
                panic("Failed to start wrapper for %s\n" % (actor_path, ),
                      Failure().getTraceback())
                reactor.stop()
            else:
                if self._initial_message is not _EMPTY:
                    self._wrapper << ('_forward', self._initial_message)

        # dbg("Running: %s%s" % (actor_path, " @ /%s" % (self._name,) if self._name else ''))
        spawn(start_actor).link_exception(lambda _: reactor.stop())

    def stopService(self):
        if getattr(self, 'node', None):
            self.node.stop()

    def __repr__(self):
        return '<ActorRunner>'
Exemple #3
0
def test_node_gc():
    node1 = Node(nid='localhost:20001', enable_remoting=False)
    ref = weakref.ref(node1)
    node1.stop()
    node1 = None
    gc.collect()
    ok_(not ref())

    node2 = Node(nid='localhost:20002', enable_remoting=True)
    ref = weakref.ref(node2)
    node2.stop()
    node2 = None
    gc.collect()
    ok_(not ref())
Exemple #4
0
def test_node_gc():
    node1 = Node(nid='localhost:20001', enable_remoting=False)
    ref = weakref.ref(node1)
    node1.stop()
    node1 = None
    gc.collect()
    ok_(not ref())

    node2 = Node(nid='localhost:20002', enable_remoting=True)
    ref = weakref.ref(node2)
    node2.stop()
    node2 = None
    gc.collect()
    ok_(not ref())
Exemple #5
0
def spin(actor_cls, name=None, init_params={}, node_id=None, initial_messages=[], keep_running=False, enable_relay=False, wrapper_cls=Wrapper):
    node = Node(nid=node_id, enable_remoting=True if node_id else False, enable_relay=enable_relay)
    stop_event = Event()
    node.spawn(wrapper_cls.using(
        actor_cls.using(**init_params),
        spawn_at=name, keep_running=keep_running,
        initial_messages=initial_messages,
        stop_event=stop_event
    ), name='-runner')
    try:
        stop_event.wait()
    except KeyboardInterrupt:
        pass
    finally:
        node.stop()
Exemple #6
0
def spin(actor_cls,
         name=None,
         init_params={},
         node_id=None,
         initial_messages=[],
         keep_running=False,
         enable_relay=False,
         wrapper_cls=Wrapper):
    node = Node(nid=node_id,
                enable_remoting=True if node_id else False,
                enable_relay=enable_relay)
    stop_event = Event()
    node.spawn(wrapper_cls.using(actor_cls.using(**init_params),
                                 spawn_at=name,
                                 keep_running=keep_running,
                                 initial_messages=initial_messages,
                                 stop_event=stop_event),
               name='-runner')
    try:
        stop_event.wait()
    except KeyboardInterrupt:
        pass
    finally:
        node.stop()