class RequestManager: """ Wrapper class around Executor for accessing request states and results """ def __init__(self, app=None, name=''): self._executor = Executor(app, name) self._ticket_dispenser = _TicketDispenser() def submit_ticketed(self, function, *args, **kwargs) -> str: """ Submits a function for execution and returns an id for later access to the requests state and result. :param function: the function :param args: the functions arguments :return: the id of the submitted execution request """ key = self._ticket_dispenser.get_ticket() self._executor.submit_stored(key, function, *args, **kwargs) return key def request_processed(self, request_id: str) -> bool: """ Checks if a request has already been processed. :param request_id: id of the request :return: True if the request was processed else False """ return self._executor.futures.done(request_id) def get_result(self, request_id: str): """ Returns the result of a finished request. :param request_id: id of the request :return: the result of the request """ return self._executor.futures.pop(request_id).result()
def test_coerce_config_types(default_app): default_app.config['EXECUTOR_MAX_WORKERS'] = '5' default_app.config['EXECUTOR_FUTURES_MAX_LENGTH'] = '10' default_app.config['EXECUTOR_PROPAGATE_EXCEPTIONS'] = 'true' executor = Executor(default_app) with default_app.test_request_context(): future = executor.submit_stored('fibonacci', fib, 35)
def test_executor_stored_future(default_app): executor = Executor(default_app) with default_app.test_request_context(): future = executor.submit_stored('fibonacci', fib, 35) assert executor.futures.done('fibonacci') is False assert future in executor.futures executor.futures.pop('fibonacci') assert future not in executor.futures
def buildpublish_start(): global executor if executor == None: executor = Executor(current_app) # if build already in progress, dont start another one if executor.futures._state('buildpublish') == 'RUNNING': return jsonify(okay=False, error='Build already in progress') # get server to publish to server = request.form.get('server') or None if server == None: return jsonify(okay=False, error='No server specified to publish to') # start a build-publish executor.submit_stored('buildpublish', buildpublish, server) return jsonify(okay=True)