changeset 42:a1456ecd25b9

fix bug with threadpool; create WSGI app and test server; use logging
author paulo
date Mon, 04 Feb 2013 23:58:02 -0800
parents 5f9bc02e9caf
children df6a1a347584
files myrss/myrss_parser.py myrss/myrss_test_server.py
diffstat 2 files changed, 45 insertions(+), 23 deletions(-) [+]
line diff
     1.1 --- a/myrss/myrss_parser.py	Fri Feb 01 01:26:07 2013 -0800
     1.2 +++ b/myrss/myrss_parser.py	Mon Feb 04 23:58:02 2013 -0800
     1.3 @@ -6,6 +6,8 @@
     1.4  import Queue
     1.5  import datetime
     1.6  import time
     1.7 +import logging
     1.8 +logging.basicConfig(level=logging.INFO)
     1.9  
    1.10  import html
    1.11  import xml.etree.ElementTree 
    1.12 @@ -78,7 +80,7 @@
    1.13  	datetime_str = dtnow.strftime("%Y-%m-%d %H:%M %Z")
    1.14  	page_title = "myrss -- %s" % datetime_str
    1.15  
    1.16 -	root = html.HTML()
    1.17 +	root = html.HTML("html")
    1.18  
    1.19  	header = root.header
    1.20  	header.title(page_title)
    1.21 @@ -113,10 +115,10 @@
    1.22  	ret = None
    1.23  
    1.24  	try:
    1.25 -		print >> sys.stderr, "--> processing %s" % url
    1.26 +		logging.info("processing %s" % url)
    1.27  		feed = urllib2.urlopen(urllib2.Request(url, headers={"User-Agent": ''}))
    1.28  	except urllib2.HTTPError as e:
    1.29 -		print >> sys.stderr, "--> (%s) %s" % (url, e)
    1.30 +		logging.info("(%s) %s" % (url, e))
    1.31  		return ret
    1.32  
    1.33  	elementTree = xml.etree.ElementTree.parse(feed)
    1.34 @@ -152,12 +154,11 @@
    1.35  			try:
    1.36  				docfeed = _process_url(url)
    1.37  			except Exception as e:
    1.38 -				print >> sys.stderr, "--> (%s) exception: %s" % (url, e)
    1.39 +				logging.info("(%s) exception: %s" % (url, e))
    1.40  			self._output_queue.put((idx, docfeed))
    1.41 -			self._input_queue.task_done()
    1.42  			
    1.43  
    1.44 -def main():
    1.45 +def main(input_queue, output_queue):
    1.46  	ret = ''
    1.47  
    1.48  	epoch_now = time.time()
    1.49 @@ -172,25 +173,16 @@
    1.50  			feedlines = feeds_file.readlines()
    1.51  
    1.52  		docstruct = [None]*len(feedlines)
    1.53 -		iq = Queue.Queue(feedlines)
    1.54 -		oq = Queue.Queue(feedlines)
    1.55 -
    1.56 -		for _ in range(MAX_THREADS):
    1.57 -			WorkerThread(input_queue=iq, output_queue=oq).start()
    1.58 -
    1.59 +		num_input = 0
    1.60  		for (i, l) in enumerate(feedlines):
    1.61  			if l[0] != '#':
    1.62  				l = l.strip()
    1.63 -				iq.put((i, l))
    1.64 +				input_queue.put((i, l))
    1.65 +				num_input += 1
    1.66  
    1.67 -		iq.join()
    1.68 -
    1.69 -		while True:
    1.70 -			try:
    1.71 -				(idx, docfeed) = oq.get_nowait()
    1.72 -				docstruct[idx] = docfeed
    1.73 -			except Queue.Empty:
    1.74 -				break
    1.75 +		for _ in range(num_input):
    1.76 +			(idx, docfeed) = output_queue.get()
    1.77 +			docstruct[idx] = docfeed
    1.78  
    1.79  		ret = _to_html(dtnow, docstruct)
    1.80  
    1.81 @@ -200,6 +192,22 @@
    1.82  	return ret
    1.83  
    1.84  
    1.85 -if __name__ == "__main__":
    1.86 -	print main()
    1.87 +class MyRssApp:
    1.88 +	def __init__(self):
    1.89 +		self._iq = Queue.Queue(MAX_THREADS)
    1.90 +		self._oq = Queue.Queue(MAX_THREADS)
    1.91  
    1.92 +		for _ in range(MAX_THREADS):
    1.93 +			WorkerThread(input_queue=self._iq, output_queue=self._oq).start()
    1.94 +
    1.95 +	def __call__(self, environ, start_response):
    1.96 +		response_body = main(self._iq, self._oq)
    1.97 +		response_headers = [
    1.98 +			("Content-Type", "text/html"),
    1.99 +			("Content-Length", str(len(response_body))),
   1.100 +		]
   1.101 +		start_response("200 OK", response_headers)
   1.102 +
   1.103 +		return [response_body]
   1.104 +
   1.105 +
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/myrss/myrss_test_server.py	Mon Feb 04 23:58:02 2013 -0800
     2.3 @@ -0,0 +1,14 @@
     2.4 +import wsgiref.simple_server 
     2.5 +import SocketServer
     2.6 +
     2.7 +import myrss_parser
     2.8 +
     2.9 +
    2.10 +class ThreadingWSGIServer(SocketServer.ThreadingMixIn, wsgiref.simple_server.WSGIServer):
    2.11 +	pass
    2.12 +
    2.13 +
    2.14 +if __name__ == "__main__":
    2.15 +	httpd = ThreadingWSGIServer(('', 8000), wsgiref.simple_server.WSGIRequestHandler)
    2.16 +	httpd.set_app(myrss_parser.MyRssApp())
    2.17 +	httpd.serve_forever()