![](/img/trans.png)
[英]python requests/urllib3 connection pooling not catching HTTP errors
[英]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.