在我的应用程序中,我在线程中发送了几个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}}
答案 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的线程中完成所有操作,但就您的代码而言,这不会有太大的不同,使用线程池。