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')
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
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
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))
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