diff options
Diffstat (limited to 'exam/xmlrpc_clients.py')
-rw-r--r-- | exam/xmlrpc_clients.py | 42 |
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() |