【问题标题】:URLLib3 Connection Pool creates only one poolURLLib3 连接池只创建一个池
【发布时间】:2015-03-25 22:35:34
【问题描述】:

目前我正在尝试抓取一个站点,但该站点不允许对一个 tcp 连接进行超过 100 个请求。所以,我尝试为请求创建多个连接池。我尝试了以下代码。不应该创建15个连接池吗?

from urllib3 import HTTPConnectionPool
for i in range(15):
    pool = HTTPConnectionPool('ajax.googleapis.com', maxsize=15)
    for j in range(15):
        resp= pool.request('GET', '/ajax/services/search/web')
    pool.num_connections

pool.num_connection 总是打印 1

【问题讨论】:

  • 您的代码发出多个请求而不是连接,这仍然是您要避免的。打印pool.num_requests 的值,看看我的意思。
  • @BlackVegetable 我要做的是为同一主机创建多个 tcp 连接。任何例子都会很棒

标签: python connection-pooling urllib3


【解决方案1】:

问题在于请求是一个接一个地同步发出的。 因此,池将始终使用相同的连接,无需创建任何其他连接。

现在假设我们使用线程运行代码,多个请求将同时发出。 在这种情况下,pool.num_connections 将大于 1:

from concurrent.futures.thread import ThreadPoolExecutor

from urllib3 import HTTPConnectionPool


pool = HTTPConnectionPool('ajax.googleapis.com', maxsize=15)

def send_request(_):
    pool.request('GET', '/ajax/services/search/web')
    print(pool.num_connections)


with ThreadPoolExecutor(max_workers=5) as executor:
    executor.map(send_request, range(5))

【讨论】:

    【解决方案2】:

    如果您需要每 100 个请求关闭一次套接字,那么您需要手动执行此操作。这是一个每 5 个请求关闭所有套接字的示例:

    import urllib3
    urllib3.add_stderr_logger() # This lets you see when new connections are made
    
    http = urllib3.PoolManager()
    url = 'http://ajax.googleapis.com/ajax/services/search/web'
    for j in range(15):
        resp = http.request('GET', url)
        if j % 5 == 0:
            # Reset the PoolManager's connections.
            # This might be overkill if you need more granular control per-host.
            http.clear()
    

    您可以使用HTTPConnectionPool 并在其上执行.close() 执行类似的操作,然后再将其替换为新的。我更喜欢尽可能使用 PoolManager(通常没有缺点)。

    如果您想获得超级精细的连接,您可以使用pool._get_conn().close()'ing 手动从HTTPConnectionPool 中取出连接。

    【讨论】:

    • 是否可以从一个客户端同时为一个特定服务器创建多个 tcp 连接。任何有关这方面的信息对我都非常有帮助。 @shazow
    • 你的意思是异步的吗?如果是这样,那么您将需要使用一些货币原语,如线程或 gevent。像您在问题中所做的那样指定 maxsize 将在池中分配那么多可能的套接字。
    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多