diff options
| -rw-r--r-- | fg21sim/webui/consolehandler.py | 78 | ||||
| -rw-r--r-- | fg21sim/webui/static/js/console.js | 13 | 
2 files changed, 89 insertions, 2 deletions
diff --git a/fg21sim/webui/consolehandler.py b/fg21sim/webui/consolehandler.py index 5c7da00..54d4305 100644 --- a/fg21sim/webui/consolehandler.py +++ b/fg21sim/webui/consolehandler.py @@ -79,6 +79,12 @@ class ConsoleHandler:                          "type: {0}, action: {1}".format(msg_type, msg_action))              if msg_action == "start":                  # FIXME/XXX: This task should be asynchronous! +                success, error = self._start() +                response["success"] = success +                if not success: +                    response["error"] = error +            elif msg_action == "start_test": +                # FIXME/XXX: This task should be asynchronous!                  success, error = self._start(msg["time"])                  response["success"] = success                  if not success: @@ -103,6 +109,35 @@ class ConsoleHandler:      # FIXME/XXX:      # * How to call this task asynchronously ?? +    def _start_test(self, *args, **kwargs): +        """ +        Start the task by submitting it to the executor + +        Returns +        ------- +        success : bool +            Whether success without any errors +        error : str +            Detail of the error if not succeed + +        """ +        if self.onetask_only and self.status["running"]: +            logger.warning("Task already running, and only one task allowed") +            success = False +            error = "already running and only one task allowed" +        else: +            logger.info("Start the task on the executor ...") +            self.status["running"] = True +            self.status["finished"] = False +            # Also push the logging messages to the client +            self._add_wsloghandler() +            future = self.executor.submit(self._task_test, *args, **kwargs) +            self.io_loop.add_future(future, self._task_callback) +            success, error = future.result() +        return (success, error) + +    # FIXME/XXX: +    # * How to call this task asynchronously ??      def _start(self, *args, **kwargs):          """          Start the task by submitting it to the executor @@ -170,7 +205,7 @@ class ConsoleHandler:          msg_response = json.dumps(response)          self.websocket.write_message(msg_response) -    def _task(self, *args, **kwargs): +    def _task_test(self, *args, **kwargs):          """          The task this console to manage. @@ -197,3 +232,44 @@ class ConsoleHandler:              time.sleep(1)          logger.info("console task: DONE!")          return (True, None) + +    def _task(self, *args, **kwargs): +        """ +        The task this console to manage. +        Perform the foregrounds simulations. + +        Returns +        ------- +        success : bool +            Whether success without any errors +        error : str +            Detail of the error if not succeed + +        NOTE +        ---- +        The task is synchronous and may be computationally intensive +        (i.e., CPU-bound rather than IO/event-bound), therefore, +        threads (or processes) are required to make it non-blocking +        (i.e., asynchronous). + +        Credit: https://stackoverflow.com/a/32164711/4856091 +        """ +        logger.info("Preparing to start foregrounds simulations ...") +        logger.info("Importing modules + Numba JIT, waiting ...") + +        from ..foregrounds import Foregrounds + +        # FIXME: This is a hack +        configs = self.websocket.configs +        logger.info("Checking the configurations ...") +        configs.check_all() + +        fg = Foregrounds(configs) +        fg.preprocess() +        fg.simulate() +        fg.postprocess() + +        logger.info("Foregrounds simulations DONE!") + +        # NOTE: Should always return a tuple of (success, error) +        return (True, None) diff --git a/fg21sim/webui/static/js/console.js b/fg21sim/webui/static/js/console.js index 86ea90c..14e0ad7 100644 --- a/fg21sim/webui/static/js/console.js +++ b/fg21sim/webui/static/js/console.js @@ -144,7 +144,18 @@ var getServerTaskStatus = function (ws) {   */  var startServerTask = function (ws, time) {    time = typeof time !== "undefined" ? time : 5; -  var msg = {type: "console", action: "start", time: time}; +  var msg = {type: "console", action: "start"}; +  ws.send(JSON.stringify(msg)); +}; + +/** + * Request to start the test task on the server. + * + * @param {Number} time - Time in seconds for the sleep test task on server + */ +var startServerTaskTest = function (ws, time) { +  time = typeof time !== "undefined" ? time : 5; +  var msg = {type: "console", action: "start_test", time: time};    ws.send(JSON.stringify(msg));  };  | 
