Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
adc2019-system
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
adc2019
adc2019-system
Commits
62d5f661
Commit
62d5f661
authored
Aug 14, 2019
by
Kento HASEGAWA
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update UI to support selective and parallel processing
parent
66c1b321
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
115 additions
and
13 deletions
+115
-13
main.py
main.py
+11
-2
host.py
roles/host.py
+19
-9
adc2019.js
static/js/adc2019.js
+33
-2
part_problem_status.html
templates/part_problem_status.html
+34
-0
part_solver_status.html
templates/part_solver_status.html
+18
-0
No files found.
main.py
View file @
62d5f661
...
...
@@ -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/<request_id>'
)
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/<name>'
)
def
webui_partem_status
(
name
=
None
):
def
webui_part
_probl
em_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
)
...
...
roles/host.py
View file @
62d5f661
...
...
@@ -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
=
10
000
,
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
()
static/js/adc2019.js
View file @
62d5f661
...
...
@@ -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
)
=>
{
...
...
templates/part_problem_status.html
View file @
62d5f661
...
...
@@ -10,6 +10,40 @@
{#% endif %#}
</div>
<div
id=
"solver-list-container"
>
<h4>
ソルバ一覧
</h4>
<div
id=
"solver-list-table-wrapper"
>
<table
class=
"table table-bordered table-sm"
id=
"workers-table"
>
<thead>
<tr>
<th>
<div
class=
"form-group form-check"
>
<input
type=
"checkbox"
class=
"form-check-input"
name=
"solver-all"
id=
"chk-solver-all"
>
</div>
</th>
<th
class=
""
>
Worker
</th>
<th
class=
""
>
Status
</th>
</tr>
</thead>
<tbody>
{% for k, w in workers.items() %}
<tr
class=
"worker-status-row"
data-cname=
"{{w.name}}"
>
<td>
<div
class=
"form-group form-check"
>
<input
type=
"checkbox"
class=
"form-check-input chk-solver"
name=
"solver-{{k}}"
id=
"chk-solver-{{k}}"
value=
"{{k}}"
>
</div>
</td>
<td
class=
"worker-status-name"
>
{{w.name}} ({{w.address}})
</td>
<td
class=
"worker-status-value"
>
{{w.status}}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div
id=
'solution-list-container'
>
<h4>
処理結果一覧
</h4>
<table
class=
"table table-bordered table-striped"
>
...
...
templates/part_solver_status.html
0 → 100644
View file @
62d5f661
<table
class=
"table table-bordered"
id=
"workers-table"
>
<thead>
<tr>
<th
class=
""
>
Worker
</th>
<th
class=
""
>
Status
</th>
</tr>
</thead>
<tbody>
{% for k, w in workers.items() %}
<tr
class=
"worker-status-row"
data-cname=
"{{w.name}}"
>
<td
class=
"worker-status-name"
>
{{w.name}} ({{w.address}})
</td>
<td
class=
"worker-status-value"
>
{{w.status}}
</td>
</tr>
{% endfor %}
</tbody>
</table>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment