Commit 8708a441 authored by Jérome Perrin's avatar Jérome Perrin

Run Manpy with a timeout

parent 187cef14
import json
import traceback
import multiprocessing
from pprint import pformat
from flask import Flask, jsonify, redirect, url_for
from flask import request
......@@ -16,12 +18,35 @@ def front_page():
def runSimulation():
parameter_dict = request.json['json']
app.logger.debug("running with:\n%s" % (pformat(parameter_dict,)))
try:
timeout = int(parameter_dict['general']['simulationTimeout'])
except (KeyError, ValueError, TypeError):
timeout = 60
queue = multiprocessing.Queue()
process = multiprocessing.Process(
target=_runSimulation,
args=(parameter_dict, queue))
process.start()
process.join(timeout)
if process.is_alive():
# process still alive after timeout, terminate it
process.terminate()
process.join()
return jsonify(dict(error='Timeout after %s seconds' % timeout))
return jsonify(queue.get())
def _runSimulation(parameter_dict, queue):
try:
result = simulate_line_json(input_data=json.dumps(parameter_dict))
return jsonify(dict(success=json.loads(result)))
queue.put(dict(success=json.loads(result)))
except Exception, e:
tb = traceback.format_exc()
return jsonify(dict(error=e.args[0], traceback=tb))
app.logger.error(tb)
queue.put(dict(error=tb))
def main(*args):
app.run(debug=True)
......
......@@ -135,7 +135,7 @@
// e.tooltip(JSON.stringify(obj['results'], undefined, " "));
})
} else {
$("#json_result").effect('shake', 50).text(data['traceback']);
$("#json_result").effect('shake', 50).text(data['error']);
}
});
e.preventDefault();
......
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