Example #1
0
 def _handle_apply_reply(self, msg):
     """Save the reply to an apply_request into our results."""
     parent = msg['parent_header']
     msg_id = parent['msg_id']
     if msg_id not in self.outstanding:
         if msg_id in self.history:
             print ("got stale result: %s"%msg_id)
             print self.results[msg_id]
             print msg
         else:
             print ("got unknown result: %s"%msg_id)
     else:
         self.outstanding.remove(msg_id)
     content = msg['content']
     header = msg['header']
     
     # construct metadata:
     md = self.metadata[msg_id]
     md.update(self._extract_metadata(header, parent, content))
     # is this redundant?
     self.metadata[msg_id] = md
     
     e_outstanding = self._outstanding_dict[md['engine_uuid']]
     if msg_id in e_outstanding:
         e_outstanding.remove(msg_id)
     
     # construct result:
     if content['status'] == 'ok':
         self.results[msg_id] = util.unserialize_object(msg['buffers'])[0]
     elif content['status'] == 'aborted':
         self.results[msg_id] = error.TaskAborted(msg_id)
     elif content['status'] == 'resubmitted':
         # TODO: handle resubmission
         pass
     else:
         self.results[msg_id] = self._unwrap_exception(content)
Example #2
0
    def _handle_apply_reply(self, msg):
        """Save the reply to an apply_request into our results."""
        parent = msg['parent_header']
        msg_id = parent['msg_id']
        if msg_id not in self.outstanding:
            if msg_id in self.history:
                print("got stale result: %s" % msg_id)
                print self.results[msg_id]
                print msg
            else:
                print("got unknown result: %s" % msg_id)
        else:
            self.outstanding.remove(msg_id)
        content = msg['content']
        header = msg['header']

        # construct metadata:
        md = self.metadata[msg_id]
        md.update(self._extract_metadata(header, parent, content))
        # is this redundant?
        self.metadata[msg_id] = md

        e_outstanding = self._outstanding_dict[md['engine_uuid']]
        if msg_id in e_outstanding:
            e_outstanding.remove(msg_id)

        # construct result:
        if content['status'] == 'ok':
            self.results[msg_id] = util.unserialize_object(msg['buffers'])[0]
        elif content['status'] == 'aborted':
            self.results[msg_id] = error.TaskAborted(msg_id)
        elif content['status'] == 'resubmitted':
            # TODO: handle resubmission
            pass
        else:
            self.results[msg_id] = self._unwrap_exception(content)
Example #3
0
 def result_status(self, msg_ids, status_only=True):
     """Check on the status of the result(s) of the apply request with `msg_ids`.
     
     If status_only is False, then the actual results will be retrieved, else
     only the status of the results will be checked.
     
     Parameters
     ----------
     
     msg_ids : list of msg_ids
         if int:
             Passed as index to self.history for convenience.
     status_only : bool (default: True)
         if False:
             Retrieve the actual results of completed tasks.
     
     Returns
     -------
     
     results : dict
         There will always be the keys 'pending' and 'completed', which will
         be lists of msg_ids that are incomplete or complete. If `status_only`
         is False, then completed results will be keyed by their `msg_id`.
     """
     if not isinstance(msg_ids, (list,tuple)):
         msg_ids = [msg_ids]
         
     theids = []
     for msg_id in msg_ids:
         if isinstance(msg_id, int):
             msg_id = self.history[msg_id]
         if not isinstance(msg_id, basestring):
             raise TypeError("msg_ids must be str, not %r"%msg_id)
         theids.append(msg_id)
     
     completed = []
     local_results = {}
     
     # comment this block out to temporarily disable local shortcut:
     for msg_id in theids:
         if msg_id in self.results:
             completed.append(msg_id)
             local_results[msg_id] = self.results[msg_id]
             theids.remove(msg_id)
     
     if theids: # some not locally cached
         content = dict(msg_ids=theids, status_only=status_only)
         msg = self.session.send(self._query_socket, "result_request", content=content)
         zmq.select([self._query_socket], [], [])
         idents,msg = self.session.recv(self._query_socket, zmq.NOBLOCK)
         if self.debug:
             pprint(msg)
         content = msg['content']
         if content['status'] != 'ok':
             raise self._unwrap_exception(content)
         buffers = msg['buffers']
     else:
         content = dict(completed=[],pending=[])
     
     content['completed'].extend(completed)
     
     if status_only:
         return content
     
     failures = []
     # load cached results into result:
     content.update(local_results)
     # update cache with results:
     for msg_id in sorted(theids):
         if msg_id in content['completed']:
             rec = content[msg_id]
             parent = rec['header']
             header = rec['result_header']
             rcontent = rec['result_content']
             iodict = rec['io']
             if isinstance(rcontent, str):
                 rcontent = self.session.unpack(rcontent)
             
             md = self.metadata[msg_id]
             md.update(self._extract_metadata(header, parent, rcontent))
             md.update(iodict)
             
             if rcontent['status'] == 'ok':
                 res,buffers = util.unserialize_object(buffers)
             else:
                 print rcontent
                 res = self._unwrap_exception(rcontent)
                 failures.append(res)
             
             self.results[msg_id] = res
             content[msg_id] = res
     
     if len(theids) == 1 and failures:
             raise failures[0]
     
     error.collect_exceptions(failures, "result_status")
     return content
Example #4
0
    def result_status(self, msg_ids, status_only=True):
        """Check on the status of the result(s) of the apply request with `msg_ids`.
        
        If status_only is False, then the actual results will be retrieved, else
        only the status of the results will be checked.
        
        Parameters
        ----------
        
        msg_ids : list of msg_ids
            if int:
                Passed as index to self.history for convenience.
        status_only : bool (default: True)
            if False:
                Retrieve the actual results of completed tasks.
        
        Returns
        -------
        
        results : dict
            There will always be the keys 'pending' and 'completed', which will
            be lists of msg_ids that are incomplete or complete. If `status_only`
            is False, then completed results will be keyed by their `msg_id`.
        """
        if not isinstance(msg_ids, (list, tuple)):
            msg_ids = [msg_ids]

        theids = []
        for msg_id in msg_ids:
            if isinstance(msg_id, int):
                msg_id = self.history[msg_id]
            if not isinstance(msg_id, basestring):
                raise TypeError("msg_ids must be str, not %r" % msg_id)
            theids.append(msg_id)

        completed = []
        local_results = {}

        # comment this block out to temporarily disable local shortcut:
        for msg_id in theids:
            if msg_id in self.results:
                completed.append(msg_id)
                local_results[msg_id] = self.results[msg_id]
                theids.remove(msg_id)

        if theids:  # some not locally cached
            content = dict(msg_ids=theids, status_only=status_only)
            msg = self.session.send(self._query_socket,
                                    "result_request",
                                    content=content)
            zmq.select([self._query_socket], [], [])
            idents, msg = self.session.recv(self._query_socket, zmq.NOBLOCK)
            if self.debug:
                pprint(msg)
            content = msg['content']
            if content['status'] != 'ok':
                raise self._unwrap_exception(content)
            buffers = msg['buffers']
        else:
            content = dict(completed=[], pending=[])

        content['completed'].extend(completed)

        if status_only:
            return content

        failures = []
        # load cached results into result:
        content.update(local_results)
        # update cache with results:
        for msg_id in sorted(theids):
            if msg_id in content['completed']:
                rec = content[msg_id]
                parent = rec['header']
                header = rec['result_header']
                rcontent = rec['result_content']
                iodict = rec['io']
                if isinstance(rcontent, str):
                    rcontent = self.session.unpack(rcontent)

                md = self.metadata[msg_id]
                md.update(self._extract_metadata(header, parent, rcontent))
                md.update(iodict)

                if rcontent['status'] == 'ok':
                    res, buffers = util.unserialize_object(buffers)
                else:
                    print rcontent
                    res = self._unwrap_exception(rcontent)
                    failures.append(res)

                self.results[msg_id] = res
                content[msg_id] = res

        if len(theids) == 1 and failures:
            raise failures[0]

        error.collect_exceptions(failures, "result_status")
        return content