Python请求URLLib3连接池大小

时间:2014-09-28 09:28:17

标签: python multithreading python-requests urllib

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

request对象的实际创建是使用requests-oauthlib进行的,request在使用时将身份验证数据插入Connection pool is full. Discarding connection.对象。

我的问题是,当并行发送大量数据时,日志会充满以下消息,最终不再向日志发送输入:

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)

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

{{1}}

1 个答案:

答案 0 :(得分:1)

阻止请求的最简单方法是,只有N个人一次尝试使用连接池,一次只能创建N.

最简单的方法是使用N个线程池来处理M个请求的队列,而不是为每个请求使用单独的线程。如果您使用的是Python 3.2+,使用concurrent.futures库非常简单 - 事实上,它与第一个ThreadPoolExecutor示例几乎相同,只是您使用requests代替urllib。如果你没有使用3.2+,那么有一个名为futures的stdlib模块的backport,它提供了相同的功能......我认为2.6,但不要引用我(PyPI现在已经关闭)

可能有一个更简单的解决方案:有一个名为requests-futures的第三方库,我从名称中猜测(再次,PyPI向下......),以某种方式为你包装。 / p>

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