[enh] async.imap added -- generator object handling
authorasciimoo <asciimoo@gmail.com>
Sun, 26 Feb 2012 03:04:33 +0000 (04:04 +0100)
committerasciimoo <asciimoo@gmail.com>
Sun, 26 Feb 2012 03:04:33 +0000 (04:04 +0100)
requests/async.py

index 24f8a617d7b519cd44fc170beb0b75e2aca08669..f2dad6940caf5cfa8cfd0786f7112a858944562a 100644 (file)
@@ -23,7 +23,7 @@ from . import api
 
 
 __all__ = (
-    'map',
+    'map', 'imap',
     'get', 'options', 'head', 'post', 'put', 'patch', 'delete', 'request'
 )
 
@@ -82,4 +82,25 @@ def map(requests, prefetch=True, size=None):
     jobs = [send(r, pool, prefetch=prefetch) for r in requests]
     gevent.joinall(jobs)
 
-    return [r.response for r in requests]
\ No newline at end of file
+    return [r.response for r in requests]
+
+
+def imap(requests, prefetch=True, size=2):
+    """Concurrently converts a generator object of Requests to
+    a generator of Responses.
+
+    :param requests: a generator of Request objects.
+    :param prefetch: If False, the content will not be downloaded immediately.
+    :param size: Specifies the number of requests to make at a time. default is 2
+    """
+
+    pool = Pool(size)
+
+    def send(r):
+        r.send(prefetch)
+        return r.response
+
+    for r in pool.imap_unordered(send, requests):
+        yield r
+
+    pool.join()
\ No newline at end of file