我正在使用 gevent 下载一些 html 页面。
有些网站速度太慢,有些网站在一段时间后停止服务请求。这就是为什么我必须限制我提出的一组请求的总时间。为此,我使用 gevent“超时”。

timeout = Timeout(10)
timeout.start()

def downloadSite():
    # code to download site's url one by one
    url1 = downloadUrl()
    url2 = downloadUrl()
    url3 = downloadUrl()
try:
    gevent.spawn(downloadSite).join()
except Timeout:
    print 'Lost state here'

但它的问题是当异常发生时我会失去所有状态。

想象一下,我抓取网站“www.test.com”。在站点管理员决定切换网络服务器进行维护之前,我已经设法下载了 10 个 url。在这种情况下,当异常发生时,我将丢失有关已抓取页面的信息。

问题是 - 即使发生超时,我如何保存状态并处理数据?

最佳答案

为什么不尝试这样的事情:

timeout = Timeout(10)

def downloadSite(url):
    with Timeout(10):
        downloadUrl(url)

urls = ["url1", "url2", "url3"]

workers = []
limit = 5
counter = 0
for i in urls:
    # limit to 5 URL requests at a time
    if counter < limit:
        workers.append(gevent.spawn(downloadSite, i))
        counter += 1
    else:
        gevent.joinall(workers)
        workers = [i,]
        counter = 0
gevent.joinall(workers)

您还可以为每个 URL 在 dict 或其他内容中保存状态,或者将失败的内容附加到不同的数组中,以便稍后重试。

关于python - 正确的greenlet终止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17724036/

10-11 23:09
查看更多