<p>看起来没有任何简单的机制来处理请求或grequests代码中的这个构建。唯一的陷阱似乎是回应。</p>
<p>这里有一个超级黑客工作,至少证明这是可能的-我修改了grequests,以保持一个发出请求的时间列表,并睡眠AsyncRequest的创建,直到每秒的请求数低于最大值。</p>
<pre><code>class AsyncRequest(object):
def __init__(self, method, url, **kwargs):
print self,'init'
waiting=True
while waiting:
if len([x for x in q if x > time.time()-15]) < 8:
q.append(time.time())
waiting=False
else:
print self,'snoozing'
gevent.sleep(1)
</code></pre>
<p>可以使用grequests.imap()以交互方式观看</p>
<pre><code>import time
import rg
urls = [
'http://www.heroku.com',
'http://python-tablib.org',
'http://httpbin.org',
'http://python-requests.org',
'http://kennethreitz.com',
'http://www.cnn.com',
]
def print_url(r, *args, **kwargs):
print(r.url),time.time()
hook_dict=dict(response=print_url)
rs = (rg.get(u, hooks=hook_dict) for u in urls)
for r in rg.imap(rs):
print r
</code></pre>
<p>我希望有一个更优雅的解决方案,但到目前为止我找不到。在会话和适配器中四处查看。或许可以增加池管理器?</p>
<p>另外,我也不会把这段代码放到产品中,'q'列表永远不会被删减,最终会变得很大。另外,我不知道它是否真的像广告上说的那样有效。它看起来就像是当我看控制台输出。</p>
<p>呃。看了这段代码我就知道是凌晨3点了。该上床睡觉了。</p>