def _process_request_queue(self): """Process the ScriptRequestQueue and then exits. This is run in a separate thread. """ LOGGER.debug("Beginning script thread") while not self._shutdown_requested and self._request_queue.has_request: request, data = self._request_queue.dequeue() if request == ScriptRequest.STOP: LOGGER.debug("Ignoring STOP request while not running") elif request == ScriptRequest.SHUTDOWN: LOGGER.debug("Shutting down") self._shutdown_requested = True elif request == ScriptRequest.RERUN: self._run_script(data) else: raise RuntimeError("Unrecognized ScriptRequest: %s" % request) # Send a SHUTDOWN event before exiting. This includes the widget values # as they existed after our last successful script run, which the # ReportSession will pass on to the next ScriptRunner that gets # created. client_state = ClientState() client_state.query_string = self._client_state.query_string self._widgets.marshall(client_state) self.on_event.send(ScriptRunnerEvent.SHUTDOWN, client_state=client_state)
def _run_script_thread(self) -> None: """The entry point for the script thread. Processes the ScriptRequestQueue, which will at least contain the RERUN request that will trigger the first script-run. When the ScriptRequestQueue is empty, or when a SHUTDOWN request is dequeued, this function will exit and its thread will terminate. """ assert self._is_in_script_thread() LOGGER.debug("Beginning script thread") # Create and attach the thread's ScriptRunContext ctx = ScriptRunContext( session_id=self._session_id, enqueue=self._enqueue, query_string=self._client_state.query_string, session_state=self._session_state, uploaded_file_mgr=self._uploaded_file_mgr, ) add_script_run_ctx(threading.current_thread(), ctx) while not self._shutdown_requested and self._request_queue.has_request: request, data = self._request_queue.dequeue() if request == ScriptRequest.STOP: LOGGER.debug("Ignoring STOP request while not running") elif request == ScriptRequest.SHUTDOWN: LOGGER.debug("Shutting down") self._shutdown_requested = True elif request == ScriptRequest.RERUN: self._run_script(data) else: raise RuntimeError("Unrecognized ScriptRequest: %s" % request) # Send a SHUTDOWN event before exiting. This includes the widget values # as they existed after our last successful script run, which the # AppSession will pass on to the next ScriptRunner that gets # created. client_state = ClientState() client_state.query_string = ctx.query_string widget_states = self._session_state.as_widget_states() client_state.widget_states.widgets.extend(widget_states) self.on_event.send(self, event=ScriptRunnerEvent.SHUTDOWN, client_state=client_state)
def _run_script_thread(self) -> None: """The entry point for the script thread. Processes the ScriptRequestQueue, which will at least contain the RERUN request that will trigger the first script-run. When the ScriptRequestQueue is empty, or when a SHUTDOWN request is dequeued, this function will exit and its thread will terminate. """ assert self._is_in_script_thread() LOGGER.debug("Beginning script thread") # Create and attach the thread's ScriptRunContext ctx = ScriptRunContext( session_id=self._session_id, enqueue=self._enqueue_forward_msg, query_string=self._client_state.query_string, session_state=self._session_state, uploaded_file_mgr=self._uploaded_file_mgr, ) add_script_run_ctx(threading.current_thread(), ctx) request = self._requests.on_scriptrunner_ready() while request.type == ScriptRequestType.RERUN: # When the script thread starts, we'll have a pending rerun # request that we'll handle immediately. When the script finishes, # it's possible that another request has come in that we need to # handle, which is why we call _run_script in a loop. self._run_script(request.rerun_data) request = self._requests.on_scriptrunner_ready() assert request.type == ScriptRequestType.STOP # Send a SHUTDOWN event before exiting. This includes the widget values # as they existed after our last successful script run, which the # AppSession will pass on to the next ScriptRunner that gets # created. client_state = ClientState() client_state.query_string = ctx.query_string widget_states = self._session_state.get_widget_states() client_state.widget_states.widgets.extend(widget_states) self.on_event.send(self, event=ScriptRunnerEvent.SHUTDOWN, client_state=client_state)