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>"
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>'
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())
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()
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()