我想对 REST webservices 进行很多 url requets。通常在 75-90k 之间。但是,我需要限制与 Web 服务的并发连接数。
我开始以以下方式玩 grequests,但很快就开始咀嚼打开的套接字。
concurrent_limit = 30
urllist = buildUrls()
hdrs = {'Host' : 'hostserver'}
g_requests = (grequests.get(url, headers=hdrs) for url in urls)
g_responses = grequests.map(g_requests, size=concurrent_limit)
当它运行一分钟左右时,我遇到了“达到的最大套接字数”错误。据我所知,grequests 中的每个 requests.get 调用都使用它自己的会话,这意味着为每个请求打开一个新套接字。
我在github上找到了一条注释,指的是如何使 grequests 使用单个会话。但这似乎有效地将所有请求限制在一个共享池中。这似乎违背了异步 http 请求的目的。
s = requests.session()
rs = [grequests.get(url, session=s) for url in urls]
grequests.map(rs)
是否可以以创建多个会话的方式使用 grequests 或 gevent.Pool?
换句话说:如何使用队列或连接池来发出许多并发 http 请求?