diff --git a/main.py b/main.py index c96b8cff96edc0305c7b12aa836c8e7cb3f9ac17..051d0398e6ad139ea14f3a081e69f48a3867fc73 100644 --- a/main.py +++ b/main.py @@ -36,6 +36,14 @@ def webui_parte_workers(): else: return abort(404) +@webui.route('/part/solver-status') +def webui_part_solver_status(): + if (adc2019system.role is not None) and (adc2019system.role.type == 'host'): + workers = adc2019system.role.get_workers() + return render_template('part_system_summary.html', workers=workers) + else: + return abort(404) + @webui.route('/part/request/') def webui_part_request_status(request_id=None): if (adc2019system.role is not None) and (adc2019system.role.type == 'host'): @@ -45,17 +53,18 @@ def webui_part_request_status(request_id=None): return abort(404) @webui.route('/part/problem/') -def webui_partem_status(name=None): +def webui_part_problem_status(name=None): if name is None: return abort(404) if (adc2019system.role is not None) and (adc2019system.role.type == 'host'): problem = adc2019system.role.get_problem(name) + workers = adc2019system.role.get_workers() if problem is None: return abort(404) else: - return render_template('part_problem_status.html', problem=problem) + return render_template('part_problem_status.html', problem=problem, workers=workers) else: return abort(404) diff --git a/roles/host.py b/roles/host.py index c87aee294971160c3fd6561cc15aa0f33551feb6..8087dabc94d4a4e1d499bc0486a0d425cadb3c6c 100644 --- a/roles/host.py +++ b/roles/host.py @@ -46,13 +46,13 @@ class Host(object): def get_workers(self): return self.worker_manager.get_workers() - def distribute_problem(self, problem_key): + def distribute_problem(self, problem_key, solvers=None): problem = self.get_problem(problem_key) if problem is None: return {'status': 'key error'} else: - request = Request(self.worker_manager, problem.get_dict()) + request = Request(self.worker_manager, problem.get_dict(), solvers=solvers) request_id = request.get_id() self.request[request_id] = request @@ -128,7 +128,11 @@ class Host(object): elif cmd == 'problem/solve': # params['problem']に指定された問題をworkerに配信 problem_key = params['problem'] - return self.distribute_problem(problem_key) + if 'solvers' in params: + solvers = params['solvers'] + else: + solvers = None + return self.distribute_problem(problem_key, solvers) elif cmd == 'problem/solution': self.store_solution(params) return {'status': 'received'} @@ -169,7 +173,7 @@ class WorkerManager(object): def request_stop(self): self.broadcast('stop', {}) - def broadcast(self, cmd, params): + def broadcast(self, cmd, params, solvers=None): threads = [] @@ -213,7 +217,7 @@ class Worker(object): class Request(object): - def __init__(self, worker_manager, data, timeout=10): + def __init__(self, worker_manager, data, timeout=10000, solvers=None): self.worker_manager = worker_manager self.data = data @@ -222,6 +226,8 @@ class Request(object): self.request_id = time.time() self.broadcast_time = None + self.solvers = solvers + self.response = dict() @property @@ -254,10 +260,14 @@ class Request(object): status = '' if worker_count == response_count: status = 'done' - elif time.time() - self.broadcast_time > self.timeout: - status = 'timeout' + # elif time.time() - self.broadcast_time > self.timeout: + # status = 'timeout' else: - status = 'processing' + elapsed_time = time.time() - self.broadcast_time + et_minutes = int(elapsed_time // 60) + et_seconds = int(elapsed_time % 60) + # status = 'processing' + status = f'{et_minutes}:{et_seconds:02}' if self.broadcast_time is None: progress = 0, @@ -285,5 +295,5 @@ class Request(object): } def broadcast(self): - self.worker_manager.broadcast('solve', self.request_data) + self.worker_manager.broadcast('solve', self.request_data, solvers=self.solvers) self.broadcast_time = time.time() diff --git a/static/js/adc2019.js b/static/js/adc2019.js index a04753a5e5087310532251001e48f53bff3bb6f5..a4a751b36a610a37cc5daa757fa8b506b2b782e8 100644 --- a/static/js/adc2019.js +++ b/static/js/adc2019.js @@ -6,6 +6,7 @@ class StatusView { this.container = $(selector); this.problem_key = null; this.request_refresh_timer = null; + // this.solver_status_refresh_timer = null; this.event = Object(); } @@ -39,20 +40,50 @@ class StatusView { var problem_name = $(e.target).parent("tr").data("problem"); var viewer_url = "/view/solution#" + problem_name + "/" + solution_id; window.open(viewer_url, "_blank"); - }) + }); + + _this.container.find('#chk-solver-all').prop('checked', true); + + _this.container.find('#chk-solver-all').on('change', (e) => { + var _me = $(e.target); + if(_me.prop('checked')){ + _this.container.find('#solver-list-table-wrapper .chk-solver').each((i, el) => { + $(el).prop('checked', true); + }); + }else{ + _this.container.find('#solver-list-table-wrapper .chk-solver').each((i, el) => { + $(el).prop('checked', false); + }); + } + }).trigger('change'); + + // _this.solver_status_refresh_timer = setInterval((function _t(){ + // _this.refresh_solver_status(); + // return _t; + // }()), 1000); }); } // 問題を解くのをスタート start_solver(){ var _this = this; + + var solvers = new Array(); + + _this.container.find('#solver-list-table-wrapper .chk-solver:checked').each((i, el) => { + var _val = $(el).val(); + solvers.push(_val); + }); + console.log(solvers); + $.ajax({ type: "POST", dataType: "json", url: "/api/problem/solve", data: JSON.stringify({ - "problem": _this.problem_key + "problem": _this.problem_key, + "solvers": solvers }), contentType: 'application/json' }).done((d) => { diff --git a/templates/part_problem_status.html b/templates/part_problem_status.html index 89ebf3e1a16b27a26d50672de1bd4c3b05efcd40..56e95952ffd41734a063c9df150a814bad094e85 100644 --- a/templates/part_problem_status.html +++ b/templates/part_problem_status.html @@ -10,6 +10,40 @@ {#% endif %#} +
+

ソルバ一覧

+
+ + + + + + + + + + {% for k, w in workers.items() %} + + + + + + {% endfor %} + +
+
+ +
+
WorkerStatus
+
+ +
+
+ {{w.name}} ({{w.address}}) + {{w.status}}
+
+
+

処理結果一覧

diff --git a/templates/part_solver_status.html b/templates/part_solver_status.html new file mode 100644 index 0000000000000000000000000000000000000000..d7b061fdd3f90bacdb7e36c7389ae80e8e48b98f --- /dev/null +++ b/templates/part_solver_status.html @@ -0,0 +1,18 @@ +
+ + + + + + + + {% for k, w in workers.items() %} + + + + + {% endfor %} + +
WorkerStatus
+ {{w.name}} ({{w.address}}) + {{w.status}}