【发布时间】:2015-01-29 19:54:01
【问题描述】:
我需要发出 10 万个头部请求,并且我在请求之上使用 gevent。我的代码运行了一段时间,但最终挂起。我不确定它为什么挂起,或者它是否挂在请求或 gevent 中。我在请求和 gevent 中都使用了 timeout 参数。
请看看我下面的代码 sn-p,让我知道我应该改变什么。
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 拉取请求,但它们也都有问题。
【问题讨论】:
-
gevent是硬性要求吗? -
不。我正在考虑搬到龙卷风。 gevent 也在吃掉我的内存
-
看起来您使用
gevent只是为了拥有一个工人池。那是对的吗?那么其他种类的池是否就足够了,还是您需要关于gevent和tornado的特定内容? -
作品池异步运行
-
docs.python.org/dev/library/… 可以异步执行并发任务。如果您想坚持使用轻量级线程,我建议使用标准 asyncio docs.python.org/dev/library/asyncio.html?highlight=asyncio
标签: python urllib2 python-requests gevent grequests