aiohttp 超时问题 访问不同url的时候 如何分别返回结果和超时?

发布于 2022-09-12 01:42:04 字数 2217 浏览 40 评论 0

源码如下:

import asyncio,time
import aiohttp

async def request(url):
    timeout = aiohttp.ClientTimeout(total=6)
    requests_start_time = time.clock()
    #使用aiohttp发起request请求。
    try:
        async with aiohttp.request("GET",url,timeout=timeout) as res:
            #r.read()不变吗,直接读取。返回来是二进制文件
            try:
                response = await res.text()
            except Exception as e:
                e = str(e)
                e = e.lower()
                if 'utf-8' in e:
                    response = await res.text('utf-8', 'ignore')
                elif 'gbk' in e or 'gb2312' in e:
                    response = await res.text('gbk', 'ignore')
            requests_end_time = time.clock()
            request_time = requests_end_time - requests_start_time
            request_time = round(request_time, 3)
            print(res.status,res.charset,request_time,response)
    except Exception as e:
        print(url,'timeout')
        pass

if __name__ == '__main__':

    urls = [
        'http://127.0.0.1:8882/test_get',
        'http://127.0.0.1:8882/test_get_timeout_5',
        'http://127.0.0.1:8882/test_get_timeout_10',
        'http://127.0.0.1:8882/test_get_timeout_15',
    ]

    #任务列表,存放多个任务对象
    stasks=[]
    for url in urls:
        c = request(url)
        task = asyncio.ensure_future(c)
        stasks.append(task)

    loop = asyncio.get_event_loop()
    #需要将任务列表封装到wait中
    loop.run_until_complete(asyncio.wait(stasks))

其中api如下:

        'http://127.0.0.1:8882/test_get',
        'http://127.0.0.1:8882/test_get_timeout_5',
        'http://127.0.0.1:8882/test_get_timeout_10',
        'http://127.0.0.1:8882/test_get_timeout_15',

test_get没有设置time.sleep(),其他依次为5秒、10秒、15秒

aiohttp.request 设置为timeout = aiohttp.ClientTimeout(total=6)

希望能实现以下api,能正确返回,但结果是全部一起timeout
'http://127.0.0.1:8882/test_get',
'http://127.0.0.1:8882/test_get_timeout_5',

如果不设定aiohttp.request 设置为timeout = aiohttp.ClientTimeout(total=6)

全部总时间非常奇怪,有时候是30.033秒,有时候高达60秒。

请问要怎么实现对于超时的api报异常,没有超时的能正确返回内容,谢谢大家

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文