summaryrefslogtreecommitdiff
path: root/server/python_session.py
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@araneo.org>2015-08-28 11:47:53 +0200
committerTimotej Lazar <timotej.lazar@araneo.org>2015-08-28 11:47:53 +0200
commit8cd70975854ddefaf9dadbade1559059ad781f3c (patch)
tree659d570a1528f219f633c5009a791ea63629a3b4 /server/python_session.py
parent5eaf1e29c779d18f1fe00f303399ecf6d3fdb80c (diff)
Add Python session support
Diffstat (limited to 'server/python_session.py')
-rw-r--r--server/python_session.py47
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']