首页 > 解决方案 > 与请求异步,如何获得速度优势

问题描述

Async 很新,所以很抱歉现在能够非常准确地表达这个问题。

我尝试按照示例(https://pythonprogramming.net/asyncio-basics-intermediate-python-tutorial/)使用异步,希望获得多个 requests.get() 的速度优势,而不是同步方式。

import asyncio
import time
import requests

async def get_text(url):
    print(f"Load {url}")
    data = requests.get(url).text
    await asyncio.sleep(0.0001)
    print(f"Finished loading {url}")
    return data

async def main(name):
    tasks = [loop.create_task(get_text(n)) for n in name]
    await asyncio.wait(tasks)
    return tasks

if __name__ == '__main__':
    url = ['https://www.nytimes.com', 'https://news.yahoo.com']
    s = time.perf_counter()
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(main(url))
    loop.close()
    e = time.perf_counter() - s
    print(f"Time takes: {e:0.2f}s")

但这显然与按顺序运行两个请求相同。你能指出我做错了什么以及如何正确地做以节省时间吗?我看到了另一个使用 ThreadPoolExecutor 和 loop.run_in_executor() 的示例,但我不确定如何合并它。

此致,

Ĵ

标签: pythonpython-asyncio

解决方案


requests做同步 IO,所以每次调用requests.get都会阻塞整个事件循环。如果您想要异步 IO,请使用另一个库,例如aiohttp.


推荐阅读