urllib3
is a powerful HTTP client for Python that provides many features such as thread safety, connection pooling, client-side SSL/TLS verification, and more. Connection pooling is one of the core features of urllib3
which allows you to reuse connections to a host, thus reducing the overhead of creating new connections for each request.
To manage connection pooling in urllib3
, you typically interact with the PoolManager
or HTTPConnectionPool
classes.
Here's how you can use connection pooling with urllib3
:
Using PoolManager
PoolManager
is the most straightforward way to handle connection pooling in urllib3
. It maintains a pool of connections that can be reused for different hosts.
import urllib3
# Create a PoolManager instance
http = urllib3.PoolManager()
# Make a request using the PoolManager instance
response = http.request('GET', 'http://httpbin.org/robots.txt')
# Read the data from the response
data = response.data.decode('utf-8')
print(data)
# The PoolManager automatically handles connection reuse.
Customizing PoolManager
You can customize the PoolManager
to control the number of connections, retries, and other behaviors.
from urllib3 import PoolManager, Retry
# Customize the PoolManager
http = PoolManager(
num_pools=10, # Maximum number of connection pools to create
maxsize=10, # Maximum number of connections to save in the pool
retries=Retry(3), # Number of retries per request
)
# Use the customized PoolManager as before
response = http.request('GET', 'http://httpbin.org/robots.txt')
# ...
Using HTTPConnectionPool
If you only need to communicate with a single host and want more control over the connection pool, you can use HTTPConnectionPool
directly.
from urllib3 import HTTPConnectionPool
# Create an HTTPConnectionPool instance for a specific host
pool = HTTPConnectionPool('httpbin.org', maxsize=10)
# Make a request using the connection pool
response = pool.request('GET', '/robots.txt')
# Read the data from the response
data = response.data.decode('utf-8')
print(data)
# The HTTPConnectionPool instance will reuse connections for each request to the host.
Using HTTPSConnectionPool
For HTTPS connections, use the HTTPSConnectionPool
which provides the same functionality as HTTPConnectionPool
, but for secure connections.
from urllib3 import HTTPSConnectionPool
# Create an HTTPSConnectionPool instance for a specific host
pool = HTTPSConnectionPool('httpbin.org', maxsize=10)
# Make a request using the connection pool
response = pool.request('GET', '/robots.txt')
# ...
Closing Pools
While urllib3
is designed to handle connection reuse efficiently, it is a good practice to release resources when you are done with them, especially when you are using the connection pools for a one-off script.
# If you're using a PoolManager or an HTTPConnectionPool, close it when done
http.clear()
pool.close()
Remember that connection pooling is a mechanism to speed up HTTP requests by reducing the time it takes to establish a connection. urllib3
's default settings are generally sufficient for common use cases, but understanding how to customize the connection pools can help you optimize performance for your specific requirements.