def get_task(self, timeout: int = None) -> Tuple[str, Result]: """Get a task object Args: timeout (int): Timeout for waiting for a task Returns: - (str) Topic of the calculation. Used in defining which queue to use to send the results - (Result) Task description Raises: TimeoutException: If the timeout on the queue is reached KillSignalException: If the queue receives a kill signal """ # Pull a record off of the queue output = self.inbound.get(timeout) # Return the kill signal if output is None: raise TimeoutException('Listening on task queue timed out') elif output[1] == "null": raise KillSignalException('Kill signal received on task queue') topic, message = output # Get the message task = Result.parse_raw(message) if self.use_pickle: task.unpickle_data() task.mark_input_received() return topic, task
def get_result(self, timeout: Optional[int] = None, topic: Optional[str] = None) -> Optional[Result]: """Get a value from the MethodServer Args: timeout (int): Timeout for waiting for a value topic (str): What topic of task to wait for. Set to ``None`` to pull all topics Returns: (Result) Result from a computation, or ``None`` if timeout is met """ # Get a value output = self.inbound.get(timeout=timeout, topic=topic) logging.debug(f'Received value: {str(output)[:50]}') # If None, return because this is a timeout if output is None: return output topic, message = output # Parse the value and mark it as complete result_obj = Result.parse_raw(message) if self.use_pickle: result_obj.unpickle_data() result_obj.mark_result_received() # Some logging logger.info( f'Client received a {result_obj.method} result with topic {topic}') return result_obj