繁体   English   中英

Python请求URLLib3连接池大小

[英]Python Requests URLLib3 Connection Pool Size

在我的应用程序中,我正在线程中发送几个request.post()请求。 根据我必须发布的数据量,创建的线程数可以是数百个。

使用requests-oauthlib进行request对象的实际创建,当使用requests-oauthlib数据时,它将身份验证数据插入request对象。

我的问题是,当并行发送大量数据时,日志将被以下消息淹没,最终没有更多输入发送到日志:

Connection pool is full. Discarding connection.

我的问题是,通过使用requests-oauthlib ,有没有一种方法requests-oauthlib ,也许在post方法本身内部,连接池的大小,或者是否应该阻塞以便其他请求可以在创建更多请求之前完成? 我之所以这样要求,是因为使用requests-oauthlib来构造一个自定义request对象,并要求requests-oauthlib使用它很棘手。

我尝试过的一件事如下,但没有效果-我继续收到警告:

import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(pool_block=True)
s.mount('http://', a)
s.mount('https://', a)

更新-现在正在以受控方式创建线程。

with futures.ThreadPoolExecutor(max_workers=10) as executor:
    executor.submit(function, args)

阻止请求(因此只有N个尝试一次使用连接池)的最简单方法是一次仅创建N个。

最简单的方法是使用N个线程池为M个请求队列服务,而不是为每个请求使用单独的线程。 如果您使用的是Python 3.2+,那么concurrent.futures .futures库非常容易,实际上,它与第一个ThreadPoolExecutor示例几乎相同,除了使用的是requests而不是urllib 如果您不使用3.2+,则stdlib模块有一个名为futures反向端口,它提供了与...相同的功能……我认为是2.6,但请不要对此引用(目前PyPI已关闭)。

可能有一个更简单的解决方案:有一个名为requests-futures的第三方库,我从名称(再次是,PyPI向下……)猜测,以某种方式为您包装了该库。

您可能还想考虑使用类似grequests东西在一个带有gevent greenlets的线程中完成所有操作,但是就您的代码而言,这与使用线程池并没有太大的不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM