summaryrefslogtreecommitdiff
path: root/exam/xmlrpc_clients.py
diff options
context:
space:
mode:
Diffstat (limited to 'exam/xmlrpc_clients.py')
-rw-r--r--exam/xmlrpc_clients.py42
1 files changed, 39 insertions, 3 deletions
diff --git a/exam/xmlrpc_clients.py b/exam/xmlrpc_clients.py
index 5dc51c6..115ee6e 100644
--- a/exam/xmlrpc_clients.py
+++ b/exam/xmlrpc_clients.py
@@ -1,5 +1,41 @@
from xmlrpclib import ServerProxy
-from settings import SERVER_PORT
+from settings import SERVER_PORTS
+import random
+import socket
-# Connect to the python server.
-python_server = ServerProxy('http://localhost:%d'%(SERVER_PORT))
+
+class PythonServer(object):
+ """A class that manages accesing the farm of Python servers and making
+ calls to them such that no one XMLRPC server is overloaded.
+ """
+ def __init__(self):
+ servers = [ServerProxy('http://localhost:%d'%(x)) for x in SERVER_PORTS]
+ self.servers = servers
+ self.indices = range(len(SERVER_PORTS))
+
+ def run_code(self, answer, test_code, user_dir):
+ """See the documentation of the method of the same name in
+ python_server.py.
+ """
+ done = False
+ result = [False, 'Unable to connect to any Python servers!']
+ # Try to connect a few times if not, quit.
+ count = 5
+ while (not done) and (count > 0):
+ try:
+ server = self._get_server()
+ result = server.run_code(answer, test_code, user_dir)
+ except socket.error:
+ count -= 1
+ else:
+ done = True
+ return result
+
+ def _get_server(self):
+ # pick a suitable server at random from our pool of servers.
+ index = random.choice(self.indices)
+ return self.servers[index]
+
+# views.py calls this Python server which forwards the request to one
+# of the running servers.
+python_server = PythonServer()