def create_communicator(self, task_prefetch_count: Optional[int] = None, with_orm: bool = True) -> 'RmqThreadCommunicator': """Create a Communicator. :param task_prefetch_count: optional specify how many tasks this communicator take simultaneously :param with_orm: if True, use ORM (de)serializers. If false, use json. This is used by verdi status to get a communicator without needing to load the dbenv. :return: the communicator instance """ from aiida.common import ConfigurationError from aiida.manage.external import rmq import kiwipy.rmq profile = self.get_profile() if profile is None: raise ConfigurationError( 'Could not determine the current profile. Consider loading a profile using `aiida.load_profile()`.' ) if task_prefetch_count is None: task_prefetch_count = self.get_config().get_option( 'daemon.worker_process_slots', profile.name) prefix = profile.rmq_prefix if with_orm: from aiida.orm.utils import serialize encoder = functools.partial(serialize.serialize, encoding='utf-8') decoder = serialize.deserialize else: # used by verdi status to get a communicator without needing to load the dbenv from aiida.common import json encoder = functools.partial(json.dumps, encoding='utf-8') decoder = json.loads return kiwipy.rmq.RmqThreadCommunicator.connect( connection_params={'url': profile.get_rmq_url()}, message_exchange=rmq.get_message_exchange_name(prefix), encoder=encoder, decoder=decoder, task_exchange=rmq.get_task_exchange_name(prefix), task_queue=rmq.get_launch_queue_name(prefix), task_prefetch_count=task_prefetch_count, async_task_timeout=self.get_config().get_option( 'rmq.task_timeout', profile.name), # This is needed because the verdi commands will call this function and when called in unit tests the # testing_mode cannot be set. testing_mode=profile.is_test_profile, )
def create_communicator(self, task_prefetch_count=None, with_orm=True): """Create a Communicator :param task_prefetch_count: optional specify how many tasks this communicator take simultaneously :param with_orm: if True, use ORM (de)serializers. If false, use json. This is used by verdi status to get a communicator without needing to load the dbenv. :return: the communicator instance :rtype: :class:`~kiwipy.rmq.communicator.RmqThreadCommunicator` """ from aiida.manage.external import rmq import kiwipy.rmq profile = self.get_profile() if task_prefetch_count is None: task_prefetch_count = self.get_config().get_option( 'daemon.worker_process_slots', profile.name) url = rmq.get_rmq_url() prefix = profile.rmq_prefix # This needs to be here, because the verdi commands will call this function and when called in unit tests the # testing_mode cannot be set. testing_mode = profile.is_test_profile message_exchange = rmq.get_message_exchange_name(prefix) task_exchange = rmq.get_task_exchange_name(prefix) task_queue = rmq.get_launch_queue_name(prefix) if with_orm: from aiida.orm.utils import serialize encoder = functools.partial(serialize.serialize, encoding='utf-8') decoder = serialize.deserialize else: # used by verdi status to get a communicator without needing to load the dbenv from aiida.common import json encoder = functools.partial(json.dumps, encoding='utf-8') decoder = json.loads return kiwipy.rmq.RmqThreadCommunicator.connect( connection_params={'url': url}, message_exchange=message_exchange, encoder=encoder, decoder=decoder, task_exchange=task_exchange, task_queue=task_queue, task_prefetch_count=task_prefetch_count, testing_mode=testing_mode, )