Created
October 15, 2011 18:38
-
-
Save juanriaza/1289956 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
requests.async | |
~~~~~~~~~~~~~~ | |
This module contains an asynchronous replica of ``requests.api``, powered | |
by gevent. All API methods return a ``Request`` instance (as opposed to | |
``Response``). A list of requests can be sent with ``map()``. | |
""" | |
try: | |
import eventlet | |
eventlet.monkey_patch() | |
except ImportError: | |
pass | |
if not 'eventlet' in locals(): | |
try: | |
import gevent | |
from gevent import monkey as curious_george | |
curious_george.patch_all(thread=False) | |
except ImportError: | |
raise RuntimeError('Gevent is required for requests.async.') | |
from . import api | |
from .hooks import dispatch_hook | |
__all__ = ( | |
'map', | |
'get', 'head', 'post', 'put', 'patch', 'delete', 'request' | |
) | |
def _patched(f): | |
"""Patches a given API function to not send.""" | |
def wrapped(*args, **kwargs): | |
return f(*args, return_response=False, **kwargs) | |
return wrapped | |
def _send(r, pools=None): | |
"""Sends a given Request object.""" | |
if pools: | |
r._pools = pools | |
r.send() | |
# Post-request hook. | |
r = dispatch_hook('post_request', r.hooks, r) | |
# Response manipulation hook. | |
r.response = dispatch_hook('response', r.hooks, r.response) | |
return r.response | |
# Patched requests.api functions. | |
get = _patched(api.get) | |
head = _patched(api.head) | |
post = _patched(api.post) | |
put = _patched(api.put) | |
patch = _patched(api.patch) | |
delete = _patched(api.delete) | |
request = _patched(api.request) | |
def map(requests, prefetch=True): | |
"""Concurrently converts a list of Requests to Responses. | |
:param requests: a collection of Request objects. | |
:param prefetch: If False, the content will not be downloaded immediately. | |
""" | |
if 'eventlet' in locals(): | |
pool = eventlet.GreenPool() | |
jobs = [pool.spawn_n(_send, r) for r in requests] | |
pool.waitall() | |
else: | |
jobs = [gevent.spawn(_send, r) for r in requests] | |
gevent.joinall(jobs) | |
if prefetch: | |
[r.response.content for r in requests] | |
return [r.response for r in requests] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment