diff options
author | Prabhu Ramachandran | 2011-11-20 21:38:05 +0530 |
---|---|---|
committer | Prabhu Ramachandran | 2011-11-20 21:38:05 +0530 |
commit | 13d4aa869a8a49c2ea27ee97b88decfde48639b5 (patch) | |
tree | 248ef1ec21672918cf9ebabf351fd164cbe280c7 /python_server.py | |
parent | 637db68dca2a909657c151566ad36897a4353999 (diff) | |
download | online_test-13d4aa869a8a49c2ea27ee97b88decfde48639b5.tar.gz online_test-13d4aa869a8a49c2ea27ee97b88decfde48639b5.tar.bz2 online_test-13d4aa869a8a49c2ea27ee97b88decfde48639b5.zip |
ENH: Python server can now run multiple servers
- the SERVER_PORTS is now a list of ports and when you run
python_server.py it will run as many servers as desired.
- python_server.py now will create multiple servers via
multiprocessing.
- the xmlrpc_clients.py is changed to deal with these multiple servers.
This allows us to handle many incoming requests.
These changes allow us to run the online test for many users. We had
over 400 simultaneous users and a total of about 650 users using the app
with these modifications.
Diffstat (limited to 'python_server.py')
-rwxr-xr-x | python_server.py | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/python_server.py b/python_server.py index 20d7440..d33ee47 100755 --- a/python_server.py +++ b/python_server.py @@ -1,7 +1,19 @@ #!/usr/bin/env python """This server runs an XMLRPC server that can be submitted code and tests and returns the output. It *should* be run as root and will run as the user -'nobody' so as to minimize any damange by errant code. +'nobody' so as to minimize any damange by errant code. This can be configured +by editing settings.py to run as many servers as desired. One can also +specify the ports on the command line. Here are examples:: + + $ sudo ./python_server.py + # Runs servers based on settings.py:SERVER_PORTS one server per port given. + +or:: + + $ sudo ./python_server.py 8001 8002 8003 8004 8005 + # Runs 5 servers on ports specified. + +All these servers should be running as nobody. """ import sys import traceback @@ -10,11 +22,15 @@ import pwd import os from os.path import isdir import signal -from settings import SERVER_PORT, SERVER_TIMEOUT +from multiprocessing import Process + +# Local imports. +from settings import SERVER_PORTS, SERVER_TIMEOUT def run_as_nobody(): - # Set the effective uid + """Runs the current process as nobody.""" + # Set the effective uid to that of nobody. nobody = pwd.getpwnam('nobody') os.setegid(nobody.pw_gid) os.seteuid(nobody.pw_uid) @@ -25,6 +41,7 @@ class TimeoutException(Exception): pass def timeout_handler(signum, frame): + """A handler for the ALARM signal.""" raise TimeoutException('Code took too long to run.') @@ -80,13 +97,21 @@ def run_code(answer, test_code, in_dir=None): return success, err +def run_server(port): + server = SimpleXMLRPCServer(("localhost", port)) + server.register_function(run_code) + server.serve_forever() def main(): run_as_nobody() - server = SimpleXMLRPCServer(("localhost", SERVER_PORT)) - server.register_function(run_code) - server.serve_forever() + if len(sys.argv) == 1: + ports = SERVER_PORTS + else: + ports = [int(x) for x in sys.argv[1:]] + + for port in ports: + p = Process(target=run_server, args=(port,)) + p.start() if __name__ == '__main__': main() -
\ No newline at end of file |