about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/requests_toolbelt/threaded/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/requests_toolbelt/threaded/__init__.py')
-rw-r--r--.venv/lib/python3.12/site-packages/requests_toolbelt/threaded/__init__.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/requests_toolbelt/threaded/__init__.py b/.venv/lib/python3.12/site-packages/requests_toolbelt/threaded/__init__.py
new file mode 100644
index 00000000..984f1e80
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/requests_toolbelt/threaded/__init__.py
@@ -0,0 +1,97 @@
+"""
+This module provides the API for ``requests_toolbelt.threaded``.
+
+The module provides a clean and simple API for making requests via a thread
+pool. The thread pool will use sessions for increased performance.
+
+A simple use-case is:
+
+.. code-block:: python
+
+    from requests_toolbelt import threaded
+
+    urls_to_get = [{
+        'url': 'https://api.github.com/users/sigmavirus24',
+        'method': 'GET',
+    }, {
+        'url': 'https://api.github.com/repos/requests/toolbelt',
+        'method': 'GET',
+    }, {
+        'url': 'https://google.com',
+        'method': 'GET',
+    }]
+    responses, errors = threaded.map(urls_to_get)
+
+By default, the threaded submodule will detect the number of CPUs your
+computer has and use that if no other number of processes is selected. To
+change this, always use the keyword argument ``num_processes``. Using the
+above example, we would expand it like so:
+
+.. code-block:: python
+
+    responses, errors = threaded.map(urls_to_get, num_processes=10)
+
+You can also customize how a :class:`requests.Session` is initialized by
+creating a callback function:
+
+.. code-block:: python
+
+    from requests_toolbelt import user_agent
+
+    def initialize_session(session):
+        session.headers['User-Agent'] = user_agent('my-scraper', '0.1')
+        session.headers['Accept'] = 'application/json'
+
+    responses, errors = threaded.map(urls_to_get,
+                                     initializer=initialize_session)
+
+.. autofunction:: requests_toolbelt.threaded.map
+
+Inspiration is blatantly drawn from the standard library's multiprocessing
+library. See the following references:
+
+- multiprocessing's `pool source`_
+
+- map and map_async `inspiration`_
+
+.. _pool source:
+    https://hg.python.org/cpython/file/8ef4f75a8018/Lib/multiprocessing/pool.py
+.. _inspiration:
+    https://hg.python.org/cpython/file/8ef4f75a8018/Lib/multiprocessing/pool.py#l340
+"""
+from . import pool
+from .._compat import queue
+
+
+def map(requests, **kwargs):
+    r"""Simple interface to the threaded Pool object.
+
+    This function takes a list of dictionaries representing requests to make
+    using Sessions in threads and returns a tuple where the first item is
+    a generator of successful responses and the second is a generator of
+    exceptions.
+
+    :param list requests:
+        Collection of dictionaries representing requests to make with the Pool
+        object.
+    :param \*\*kwargs:
+        Keyword arguments that are passed to the
+        :class:`~requests_toolbelt.threaded.pool.Pool` object.
+    :returns: Tuple of responses and exceptions from the pool
+    :rtype: (:class:`~requests_toolbelt.threaded.pool.ThreadResponse`,
+        :class:`~requests_toolbelt.threaded.pool.ThreadException`)
+    """
+    if not (requests and all(isinstance(r, dict) for r in requests)):
+        raise ValueError('map expects a list of dictionaries.')
+
+    # Build our queue of requests
+    job_queue = queue.Queue()
+    for request in requests:
+        job_queue.put(request)
+
+    # Ensure the user doesn't try to pass their own job_queue
+    kwargs['job_queue'] = job_queue
+
+    threadpool = pool.Pool(**kwargs)
+    threadpool.join_all()
+    return threadpool.responses(), threadpool.exceptions()