diff options
author | Timotej Lazar <timotej.lazar@araneo.org> | 2015-08-28 11:47:53 +0200 |
---|---|---|
committer | Timotej Lazar <timotej.lazar@araneo.org> | 2015-08-28 11:47:53 +0200 |
commit | 8cd70975854ddefaf9dadbade1559059ad781f3c (patch) | |
tree | 659d570a1528f219f633c5009a791ea63629a3b4 /server/python_session.py | |
parent | 5eaf1e29c779d18f1fe00f303399ecf6d3fdb80c (diff) |
Add Python session support
Diffstat (limited to 'server/python_session.py')
-rw-r--r-- | server/python_session.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/server/python_session.py b/server/python_session.py new file mode 100644 index 0000000..7a5d22a --- /dev/null +++ b/server/python_session.py @@ -0,0 +1,47 @@ +# coding=utf-8 + +import threading +import python.engine + +__all__ = ['PythonSession'] + +class PythonSession(object): + """Abstracts a Python session. + Only public methods are available to the outside world due to the use of multiprocessing managers. + Therefore prefix any private methods with an underscore (_). + No properties are accessible; use getters and setters instead. + Values are passed by value instead of by reference (deep copy!). + """ + def __init__(self): + self._access_lock = threading.Lock() + self._interpreter = None + + def create(self): + with self._access_lock: + if not self._interpreter: + self._interpreter = python.engine.create() + + def pull(self): + with self._access_lock: + if self._interpreter is None: + return 'Python is not running' + return python.engine.pull(self._interpreter) + + def push(self, stdin): + with self._access_lock: + if self._interpreter is not None: + python.engine.push(self._interpreter, stdin) + + def destroy(self): + with self._access_lock: + if self._interpreter is not None: + python.engine.destroy(self._interpreter) + self._interpreter = None + + def __del__(self): + if hasattr(self, '_interpreter') and self._interpreter is not None: + python.engine.destroy(self._interpreter) + self._interpreter = None + + def test(self, user_id, problem_id, program): + return ['Python testing is not implemented yet'] |