Commit a4d7fc10 authored by Kento HASEGAWA's avatar Kento HASEGAWA

Update the request view and its backend process

parent 4b5c132c
...@@ -54,16 +54,24 @@ class Host(object): ...@@ -54,16 +54,24 @@ class Host(object):
if problem is None: if problem is None:
return {'status': 'key error'} return {'status': 'key error'}
else: else:
request = Request(self.worker_manager, problem.get_dict(), solvers=solvers) # request = Request(self.worker_manager, problem.get_dict(), solvers=solvers)
request_id = request.get_id() if solvers is None:
self.request[request_id] = request _solvers = self.worker_manager.get_workers()
self.problem_to_request[problem_key].append(request_id) else:
_solvers = dict()
for k, v in self.worker_manager.get_workers().items():
if k in solvers:
_solvers[k] = v
for _, v in _solvers.items():
request = Request(self.worker_manager, problem.get_dict(), v)
request.broadcast()
request_id = request.get_id()
self.request[request_id] = request
self.problem_to_request[problem_key].append(request_id)
request.broadcast()
return { return {
'status': 'processed', 'status': 'processed',
'request_id': request_id,
'timeout': request.timeout
} }
def get_problems(self): def get_problems(self):
...@@ -81,6 +89,10 @@ class Host(object): ...@@ -81,6 +89,10 @@ class Host(object):
if solution['status'] != 'done': if solution['status'] != 'done':
return {'status': 'ignored'} return {'status': 'ignored'}
problem_key = solution['problem'] problem_key = solution['problem']
request_id = solution['request_id']
if request_id in self.request:
self.request[request_id].store_response(solution)
if problem_key in self.problems: if problem_key in self.problems:
res = self.problems[problem_key].put_partial_solution(solution) res = self.problems[problem_key].put_partial_solution(solution)
...@@ -308,6 +320,11 @@ class Worker(object): ...@@ -308,6 +320,11 @@ class Worker(object):
self.name = params['name'] self.name = params['name']
self.host = params['host'] self.host = params['host']
self.role = params['role'] self.role = params['role']
if not 'partial_mode' in params:
self.partial_mode = False
else:
self.partial_mode = params['partial_mode']
self.params = params self.params = params
self.status = 'Ready' self.status = 'Ready'
...@@ -339,23 +356,33 @@ class Worker(object): ...@@ -339,23 +356,33 @@ class Worker(object):
class Request(object): class Request(object):
def __init__(self, worker_manager, data, timeout=10000, solvers=None): def __init__(self, worker_manager, data, worker, timeout=10000):
self.worker_manager = worker_manager # self.worker_manager = worker_manager
self.data = data self.data = data
self.timeout = timeout self.timeout = timeout
self.request_id = time.time() self.request_id = time.time()
self.broadcast_time = None self.request_time = None
self.done_time = None
if solvers is None: # if solvers is None:
self.solvers = list(self.worker_manager.get_workers().keys()) # self.solvers = list(self.worker_manager.get_workers().keys())
else: # else:
self.solvers = solvers # self.solvers = solvers
self.solver = worker
self.response = dict() self.response = dict()
for w in self.solvers: # for w in self.solvers:
self.response[w] = list() # self.response[w] = list()
self.response = list()
if self.solver.partial_mode:
self.part_nums = len(data['group_problems'])
self.solved = [0 for v in range(self.part_nums + 1)]
else:
self.part_nums = 1
self.solved = [0]
@property @property
def request_data(self): def request_data(self):
...@@ -371,55 +398,62 @@ class Request(object): ...@@ -371,55 +398,62 @@ class Request(object):
return self.request_data return self.request_data
def store_response(self, data): def store_response(self, data):
worker = data['worker'] # worker = data['worker']
self.response[worker].append(data) # self.response[worker].append(data)
# self.response[worker] = data # self.response[worker] = data
self.response.append(data)
print(data)
if 'part_id' in data:
idx = data['part_id']
print(idx)
if data['status'] == 'done':
self.solved[idx] += 1
else:
self.solved[-1] = 1
self.done_time = time.time()
def get_status(self): def get_status(self):
worker_count = 0
response_count = 0
for v in self.solvers:
worker_count += 1
if v in self.response:
response_count += 1
status = '' status = ''
if worker_count == response_count:
status = 'done' if self.solved[-1] == 1:
# elif time.time() - self.broadcast_time > self.timeout: elapsed_time = self.done_time - self.request_time
# status = 'timeout'
else:
elapsed_time = time.time() - self.broadcast_time
et_minutes = int(elapsed_time // 60) et_minutes = int(elapsed_time // 60)
et_seconds = int(elapsed_time % 60) et_seconds = int(elapsed_time % 60)
# status = 'processing' status = f'done ({self.solved[-1]}) [{et_minutes}:{et_seconds:02}]'
status = f'{et_minutes}:{et_seconds:02}' elif self.solved[-1] == -1:
status = 'failed'
if self.broadcast_time is None:
progress = 0,
else: else:
progress_problem = response_count / worker_count * 100 if self.solver.status == 'Not connected':
progress_time = (time.time() - self.broadcast_time) / self.timeout * 100 status = 'Not connected'
progress = min(100, max(progress_problem, progress_time))
worker_status = dict()
for v in self.solvers:
if v in self.response and len(self.response[v]) > 0:
worker_status[v] = self.response[v][0]['status']
else: else:
if self.worker_manager.workers[v].status == 'Not connected': if len(self.solved) == 1:
worker_status[v] = 'Not connected' status_mes = 'Waiting for response'
else: elif len(self.solved) > 1:
worker_status[v] = 'Waiting for response' counter = sum([v>0 for v in self.solved])
status_mes = f'{counter}/{len(self.solved)}'
elapsed_time = time.time() - self.request_time
et_minutes = int(elapsed_time // 60)
et_seconds = int(elapsed_time % 60)
elapsed_time_str = f'{et_minutes}:{et_seconds:02}'
status = f'{status_mes} [{elapsed_time_str}]'
return { return {
'status': status, 'status': status,
'workers': worker_count, 'worker': self.solver.address,
'solutions': response_count, # 'solutions': response_count,
'progress': progress, # 'progress': progress,
'worker_status': worker_status # 'worker_status': worker_status
} }
def broadcast(self): def broadcast(self):
self.worker_manager.broadcast('solve', self.request_data, solvers=self.solvers)
self.broadcast_time = time.time() def _sender():
self.solver.post('solve', self.request_data)
_th = threading.Thread(name=f'request_sender_{self.solver.address}', target=_sender, daemon=True)
_th.start()
self.request_time = time.time()
...@@ -82,6 +82,9 @@ class Solver(object): ...@@ -82,6 +82,9 @@ class Solver(object):
solution['block_map'] = gblock_map solution['block_map'] = gblock_map
self.submit_solution(data, solution) self.submit_solution(data, solution)
if self.solver.stop_flag:
break
else: else:
start_time = time.time() start_time = time.time()
solution = self.solver.solve(params) solution = self.solver.solve(params)
......
...@@ -96,7 +96,8 @@ class StatusView { ...@@ -96,7 +96,8 @@ class StatusView {
}), }),
contentType: 'application/json' contentType: 'application/json'
}).done((d) => { }).done((d) => {
var request_id = d['request_id']; console.log(d);
// var request_id = d['request_id'];
// var timeout = d['timeout']; // var timeout = d['timeout'];
// _this.container.find('#solver-processing-modal').modal({ // _this.container.find('#solver-processing-modal').modal({
......
<div> <div>
{% for r in status %}
<p>処理結果:<span id='request-status-value'>{{r.status}}</span></p>
<table class="table table-bordered table-sm"> <table class="table table-bordered table-sm">
<!-- <tr>
<th>Worker (Solver)</th>
<th>Status</th>
</tr> -->
<tbody> <tbody>
{% for k, v in r['worker_status'].items() %} {% for r in status %}
<tr> <tr>
<td>{{k}}</td> <td>{{r['worker']}}</td>
<td>{{v}}</td> <td>{{r['status']}}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
{% endfor %}
</div> </div>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment