首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >URLLib3请求连接池大小

URLLib3请求连接池大小
EN

Stack Overflow用户
提问于 2014-09-28 09:28:16
回答 1查看 2.8K关注 0票数 1

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

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

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

Connection pool is full. Discarding connection.

我的问题是,在使用requests-oauthlib时,是否有一种方法可以在post方法本身中详细说明连接池的大小,或者它是否应该阻塞,以便其他请求能够在创建更多请求之前完成?我之所以这样要求,是因为在使用requests-oauthlib时,要构造一个自定义request对象并要求requests-oauthlib使用它是很困难的。

我试过的一件事是这样做的,但没有效果--我继续收到警告:

代码语言:javascript
复制
import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(pool_block=True)
s.mount('http://', a)
s.mount('https://', a)

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

代码语言:javascript
复制
with futures.ThreadPoolExecutor(max_workers=10) as executor:
    executor.submit(function, args)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-28 10:47:53

阻止请求的最简单方法是一次只创建N个请求,其中只有N个请求试图同时使用连接池。

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

也许有一个更简单的解决方案:有一个名为requests-futures的第三方库,我猜从名称上看(同样,PyPI down…)以某种方式为你包装。

您可能还想考虑使用grequests这样的东西在一个线程中使用gevent绿包来完成这一切,但就您的代码而言,这与使用线程池并没有太大的不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26083489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档