我需要发送100k个head请求,使用的是在requests之上的gevent。我的代码运行一段时间后会卡住。我不确定它为什么会卡住,或者是在requests还是gevent中卡住了。我在requests和gevent中都使用了timeout参数。
请看下面的代码片段,让我知道我应该改变什么。
import gevent
from gevent import monkey, pool
monkey.patch_all()
import requests
def get_head(url, timeout=3):
try:
return requests.head(url, allow_redirects=True, timeout=timeout)
except:
return None
def expand_short_urls(short_urls, chunk_size=100, timeout=60*5):
chunk_list = lambda l, n: ( l[i:i+n] for i in range(0, len(l), n) )
p = pool.Pool(chunk_size)
print 'Expanding %d short_urls' % len(short_urls)
results = {}
for i, _short_urls_chunked in enumerate(chunk_list(short_urls, chunk_size)):
print '\t%d. processing %d urls @ %s' % (i, chunk_size, str(datetime.datetime.now()))
jobs = [p.spawn(get_head, _short_url) for _short_url in _short_urls_chunked]
gevent.joinall(jobs, timeout=timeout)
results.update({_short_url:job.get().url for _short_url, job in zip(_short_urls_chunked, jobs) if job.get() is not None and job.get().status_code==200})
return results
我尝试过使用grequests,但它已被放弃,我也查看了github的pull requests,但它们也存在问题。
gevent
是一个硬性要求吗? - That1Guygevent
来简单地拥有一个工作池,是这样吗?那么另一种类型的工作池是否足够,或者你需要gevent
和tornado
中特定的某些东西? - That1Guy