多个HTTP请求的异步状态检查

我有一个包含数千个URL的列表,这些URL指向远程服务器上的图像/视频。就像是:

urls = ['https://foo.bar/baz.jpeg', 'https://foo.bar/jaz.mp4', ...]

通过获取这些url,一些响应会显示为404 Not Found,这是可以的,因为服务器上的数据可能已过时或已删除。我要尝试做的事情是快速识别出哪些网址将为我提供404

当我打开浏览器并在地址栏上键入错误的URL之一时,“未找到”错误大约需要200毫秒来检索。通过进行一些无辜的计算,我预计,如果以异步方式进行,〜1.000调用将花费不超过4秒的时间。

但是,通过使用此代码,我认为这是适当的:

def async_check(urls):

    async def fetch(session, url):
        async with session.get(url) as response:
            if response.status != 200:
                return False
            else:
                return True

    async def run(urls):
        async with ClientSession() as session:
            return await asyncio.gather(*[fetch(session, url) for url in urls])

    return asyncio.get_event_loop().run_until_complete(run(urls))

经过的时间更长,有时实际上是超时。

我认为这是由于列表中的网址没有错误,这些网址指向的图像和视频可能需要很长时间才能加载为响应对象,最终要花费大量时间才能完成任务。

在考虑了如何实现404验证之后,我想到了一个看起来或多或少像这样的流程:

对于每个url,都可以使用get方法异步获取它,还可以异步睡眠相对长的时间(例如1秒)。睡眠完成后,尝试查看响应是否为“就绪”,如果是,则将状态代码404(或不同于200)添加到我的错误URL列表中如果在睡眠后响应还不是“就绪”,那么我将认为这是由于加载了沉重的图像/视频而导致的,因此认为它没有错误

由于每个呼叫的等待时间上限为1秒,因此我希望对于一堆URL,它的运行速度相对较快。

是否将其视为解决此问题的巧妙方法,还是有更聪明的解决方法?

用户名

我认为这是由于列表中的网址没有错误,这些网址指向的图像和视频可能需要很长时间才能加载为响应对象,最终要花费大量时间才能完成任务。

很难事先知道这是否真的正确,但是您可以通过添加time.time()用于测量每个请求所经过的时间并显示其状态的代码来肯定地对其进行测试

请注意,除非您await response.read()或具有同等资格,否则客户端不会“加载”响应主体,只有标头会被加载。尽管如此,某些无故障的URL仍可能需要很长时间才能返回标头。某些故障故障也可能需要很长时间才能返回错误状态,也许是那些您没有手动检查的故障故障。asyncio.gather()所需的时间与列表中最长的URL一样长,因此,如果您有数千个URL,则至少其中一些必然会滞后。

不过,假设你的前提是正确的,你可以实现由包装的限制fetchwait_for

    async def fetch_with_limit(session, url):
        try:
            return await asyncio.wait_for(fetch(session, url), 1)
        except asyncio.TimeoutError:
            return True  # took more than 1s, probably non-faulty

现在您可以使用fetch_with_limit代替fetch

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Resttemplate多个异步HTTP请求

来自分类Dev

连续发出多个异步HTTP请求并使用Realm编写

来自分类Dev

连续发出多个异步HTTP请求并使用Realm编写

来自分类Dev

节点。带有多个http请求的js嵌套异步映射

来自分类Dev

等待thunk完成HTTP请求,然后再检查状态

来自分类Dev

多个异步请求

来自分类Dev

多个异步请求

来自分类Dev

异步HTTP请求的顺序

来自分类Dev

异步齐发HTTP请求

来自分类Dev

异步并行HTTP请求

来自分类Dev

异步获取多个承诺的状态

来自分类Dev

多个异步请求限制jQuery

来自分类Dev

异步发送多个goutte请求

来自分类Dev

多个 POST 请求的异步问题

来自分类Dev

异步任务的HTTP状态代码

来自分类Dev

使嵌套的HTTP请求与Java异步

来自分类Dev

等待异步HTTP请求完成

来自分类Dev

异步Http发布请求无效

来自分类Dev

使用XHR执行HTTP POST或PUT请求时,应该检查状态吗?

来自分类Dev

Qt检查多个按钮的状态

来自分类Dev

在PHP中异步处理多个GET请求

来自分类Dev

如何管理多个异步NSURLConnection请求

来自分类Dev

如何管理多个异步NSURLConnection请求

来自分类Dev

Java中的多个异步请求处理

来自分类Dev

嵌套 for 循环中的多个异步请求

来自分类Dev

如何链接承诺和多个异步请求?

来自分类Dev

检查多个异步Web服务调用的结果

来自分类Dev

使用python3异步HTTP请求

来自分类Dev

节点中HTTP请求的异步处理