コード例 #1
0
ファイル: stdvars.py プロジェクト: bigcomputing/big-server
    def fetch(self, client, blocking, val_index, metadata):
        #pylint: disable-msg=W0613
        """Handle a fetch request on this variable.

          Arguments:
            client     - client for whom to perform fetch
            blocking   - is this a blocking fetch?
            val_index  - index of value to fetch (unused here)
        """
        fetch_location = max(val_index - self._index + 1, 0)
        if fetch_location > 0:
            raise WorkspaceFailure(
                    'ifetch* only supported at beginning of FIFO')
        try:
            value = remove_first(self._contents)
            var_metadata = remove_first(self._metadata)
            value.consumed()
            response = Response(var_metadata, value)
            response.iterstate = (self.vid, self._index)
            self._index += 1
            return response
        except IndexError:
            if blocking:
                self.add_fetcher(client)
                return None
            else:
                raise WorkspaceFailure('no value available')
コード例 #2
0
    def fetch_next_task(self, worker):
        """Get the next task for a given worker, removing it from the
        queues."""
        try:
            bcastlist = self.__broadcast_by_worker[worker]
            if len(bcastlist) != 0:
                return remove_first(bcastlist)
            if len(self.__unicast) != 0:
                return remove_first(self.__unicast)
        except KeyError:
            # No such worker.
            pass

        return None
コード例 #3
0
 def get_result(self, jid):
     """Get the next result for a given job id."""
     if self.__results.has_key(jid):
         queue = self.__results[jid]
         result = remove_first(queue)
         if len(queue) == 0:
             del self.__results[jid]
         return result
     return None
コード例 #4
0
    def wake_one(self):
        """Wake any task waiter.  This should be called any time a task is
        submitted, in case there are any blocked clients ready to service the
        request.
        """
        if len(self.__blocked_clients) != 0:
            client, request, handler = remove_first(self.__blocked_clients)
            try:
                val = self.workspace.task_queue_fetch(client, request)
            except OperationFailure, fail:
                handler(fail)
                return

            if val is not None:
                handler(val)
            else:
                self.__blocked_clients.append((client, request, handler))
コード例 #5
0
    def wake_one(self, jid):
        """Wake one of the result waiters waiting for a given job id, if anyone
        is waiting for the job.
        """
        if self.__workspace.is_shutting_down:
            self.kill_all()
            return

        if self.__blocked_clients.has_key(jid):
            client = remove_first(self.__blocked_clients[jid])

            try:
                val = self.__workspace.result_queue_fetch(* client[0:2])
                if val is None:
                    self.__blocked_clients[jid].append(client)
                else:
                    client[2](val)
                    if len(self.__blocked_clients[jid]) == 0:
                        del self.__blocked_clients[jid]
            except Exception:
                self.__blocked_clients[jid].append(client)
                raise