diff options
Diffstat (limited to 'fg21sim')
-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)); }; |