From: maxious Date: Wed, 06 Apr 2011 03:02:06 +0000 Subject: Make schedule viewer multithreaded X-Git-Url: http://maxious.lambdacomplex.org/git/?p=busui.git&a=commitdiff&h=388959a184f01c2ba7b191fabb3b6c3e9954380b --- Make schedule viewer multithreaded --- --- a/schedule_viewer.py +++ b/schedule_viewer.py @@ -22,6 +22,9 @@ import BaseHTTPServer, sys, urlparse +from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from SocketServer import ThreadingMixIn +import threading import bisect from gtfsscheduleviewer.marey_graph import MareyGraph import gtfsscheduleviewer @@ -57,34 +60,8 @@ return list(iterable) return simplejson.JSONEncoder.default(self, obj) -# Code taken from -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/425210/index_txt -# An alternate approach is shown at -# http://mail.python.org/pipermail/python-list/2003-July/212751.html -# but it requires multiple threads. A sqlite object can only be used from one -# thread. -class StoppableHTTPServer(BaseHTTPServer.HTTPServer): - def server_bind(self): - BaseHTTPServer.HTTPServer.server_bind(self) - self.socket.settimeout(1) - self._run = True - - def get_request(self): - while self._run: - try: - sock, addr = self.socket.accept() - sock.settimeout(None) - return (sock, addr) - except socket.timeout: - pass - - def stop(self): - self._run = False - - def serve(self): - while self._run: - self.handle_request() - +class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): + """Handle requests in a separate thread.""" def StopToTuple(stop): """Return tuple as expected by javascript function addStopMarkerFromList""" @@ -254,9 +231,11 @@ parsed_params['time'] = int(round(float(parsed_params['time']),-2)) paramkey = tuple(sorted(parsed_params.items())) if handler_name in self.cache and paramkey in self.cache[handler_name] : - print ("Cache hit for ",handler_name," params ",parsed_params) + print ("Cache hit for ",handler_name," params ",parsed_params, + " thread ", threading.currentThread().getName()) else: - print ("Cache miss for ",handler_name," params ",parsed_params) + print ("Cache miss for ",handler_name," params ",parsed_params, + " thread ", threading.currentThread().getName()) result = handler(parsed_params) if not handler_name in self.cache: self.cache[handler_name] = {} @@ -713,14 +692,13 @@ t0 = datetime.datetime.now() schedule.Load(options.feed_filename) print ("Loaded in", (datetime.datetime.now() - t0).seconds , "seconds") - server = StoppableHTTPServer(server_address=('', options.port), + server = ThreadedHTTPServer(server_address=('', options.port), RequestHandlerClass=RequestHandlerClass) server.key = options.key server.schedule = schedule server.file_dir = options.file_dir server.host = options.host - server.feed_path = options.feed_filename - + server.feed_path = options.feed_filename print ("To view, point your browser at http://localhost:%d/" %