def create_daemon_runner(self, loop=None): """Create and return a new daemon runner. This is used by workers when the daemon is running and in testing. :param loop: the (optional) tornado event loop to use :type loop: :class:`tornado.ioloop.IOLoop` :return: a runner configured to work in the daemon configuration :rtype: :class:`aiida.engine.runners.Runner` """ import plumpy from aiida.engine import persistence from aiida.manage.external import rmq runner = self.create_runner(rmq_submit=True, loop=loop) runner_loop = runner.loop # Listen for incoming launch requests task_receiver = rmq.ProcessLauncher( loop=runner_loop, persister=self.get_persister(), load_context=plumpy.LoadSaveContext(runner=runner), loader=persistence.get_object_loader()) def callback(*args, **kwargs): return plumpy.create_task(functools.partial( task_receiver, *args, **kwargs), loop=runner_loop) runner.communicator.add_task_subscriber(callback) return runner
def create_daemon_runner( self, loop: Optional[asyncio.AbstractEventLoop] = None) -> 'Runner': """Create and return a new daemon runner. This is used by workers when the daemon is running and in testing. :param loop: the (optional) asyncio event loop to use :return: a runner configured to work in the daemon configuration """ from plumpy.persistence import LoadSaveContext from aiida.engine import persistence from aiida.manage.external import rmq runner = self.create_runner(rmq_submit=True, loop=loop) runner_loop = runner.loop # Listen for incoming launch requests task_receiver = rmq.ProcessLauncher( loop=runner_loop, persister=self.get_persister(), load_context=LoadSaveContext(runner=runner), loader=persistence.get_object_loader()) assert runner.communicator is not None, 'communicator not set for runner' runner.communicator.add_task_subscriber(task_receiver) return runner