summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorRyan Williams <rdw@lindenlab.com>2010-02-19 17:42:33 -0500
committerRyan Williams <rdw@lindenlab.com>2010-02-19 17:42:33 -0500
commit379ceb4741180fa19587651b5e9fb61d758ce6c4 (patch)
tree1ad673edb0ef5a6201df897a6bce582b5718d3da /examples
parentfe30947508044d3273665c56af733256e2820e4d (diff)
downloadeventlet-379ceb4741180fa19587651b5e9fb61d758ce6c4.tar.gz
Added dispatch pattern that shows how to use GreenPiles. Feedparser examples in the examples dir.
Diffstat (limited to 'examples')
-rw-r--r--examples/feedscraper-testclient.py25
-rw-r--r--examples/feedscraper.py41
2 files changed, 66 insertions, 0 deletions
diff --git a/examples/feedscraper-testclient.py b/examples/feedscraper-testclient.py
new file mode 100644
index 0000000..570ae47
--- /dev/null
+++ b/examples/feedscraper-testclient.py
@@ -0,0 +1,25 @@
+from eventlet.green import urllib2
+
+big_list_of_feeds = """
+http://blog.eventlet.net/feed/
+http://rss.slashdot.org/Slashdot/slashdot
+http://feeds.boingboing.net/boingboing/iBag
+http://feeds.feedburner.com/RockPaperShotgun
+http://feeds.penny-arcade.com/pa-mainsite
+http://achewood.com/rss.php
+http://raysmuckles.blogspot.com/atom.xml
+http://rbeef.blogspot.com/atom.xml
+http://journeyintoreason.blogspot.com/atom.xml
+http://orezscu.blogspot.com/atom.xml
+http://feeds2.feedburner.com/AskMetafilter
+http://feeds2.feedburner.com/Metafilter
+http://stackoverflow.com/feeds
+http://feeds.feedburner.com/codinghorror
+http://www.tbray.org/ongoing/ongoing.atom
+http://www.zeldman.com/feed/
+http://ln.hixie.ch/rss/html
+"""
+
+url = 'http://localhost:9010/'
+result = urllib2.urlopen(url, big_list_of_feeds)
+print result.read() \ No newline at end of file
diff --git a/examples/feedscraper.py b/examples/feedscraper.py
new file mode 100644
index 0000000..1c7f290
--- /dev/null
+++ b/examples/feedscraper.py
@@ -0,0 +1,41 @@
+"""A simple web server that accepts POSTS containing a list of feed urls,
+and returns the titles of those feeds.
+"""
+import eventlet
+from eventlet import patcher
+feedparser = patcher.import_patched('feedparser')
+
+# the pool provides a safety limit on our concurrency
+pool = eventlet.GreenPool()
+
+def fetch_title(url):
+ d = feedparser.parse(url)
+ return d.feed.get('title', '')
+
+def app(environ, start_response):
+ if environ['REQUEST_METHOD'] != 'POST':
+ start_response('403 Forbidden', [])
+ return []
+
+ # the pile collects the result of a concurrent operation -- in this case,
+ # the collection of feed titles
+ pile = eventlet.GreenPile(pool)
+ for line in environ['wsgi.input'].readlines():
+ url = line.strip()
+ if url:
+ pile.spawn(fetch_title, url)
+ # since the pile is an iterator over the results,
+ # you can use it in all sorts of great Pythonic ways
+ titles = '\n'.join(pile)
+ start_response('200 OK', [('Content-type', 'text/plain')])
+ return [titles]
+
+
+if __name__ == '__main__':
+ from eventlet import wsgi
+ from eventlet.green import socket
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
+ sock.bind(('localhost', 9010))
+ sock.listen(50)
+ wsgi.server(sock, app) \ No newline at end of file