在我的应用程序中,我用线程发送几个request.post()请求。根据我必须发布的数据量,创建的线程数量可以是数百个。
request对象的实际创建是使用requests-oauthlib进行的,它在使用request对象时将身份验证数据插入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)发布于 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绿包来完成这一切,但就您的代码而言,这与使用线程池并没有太大的不同。
https://stackoverflow.com/questions/26083489
复制相似问题