创建多个异步请求

Creating multiple async requests

我刚刚开始探索这个名为 Requests-Html, which I've just dicovered through Corey Schafer tutorial 的新库,挑战是创建 n 个不同请求的异步调用

因此,例如,我们有以下代码,运行时间约为 3.6 秒:

async def get_delay1():
    r = await asession.get("https://httpbin.org/delay/1")
    return r

async def get_delay2():
    r = await asession.get("https://httpbin.org/delay/2")
    return r

async def get_delay3():
    r = await asession.get("https://httpbin.org/delay/3")
    return r

asession = AsyncHTMLSession()

t1 = time.perf_counter()

results = asession.run(get_delay1, get_delay2, get_delay3)

for result in results:
    response = result.html.url
    print(response)

t2 = time.perf_counter()

print(t2 - t1)

问题来了,如果想用这个库创建一个500异步请求怎么办?总不会是我要编写 500 个不同的函数吧?

我试图用函数生成器创建一个列表,这样我就可以在其中自动传递 n 个不同的函数,:

tasks = [get_delay1, get_delay2, get_delay3]
results = asession.run(tasks)

但我得到

ERROR`: 
asyncio.ensure_future(coro()) for coro in coros
TypeError: 'list' object is not callable

我已经知道怎么做了。

创建列表后,我们必须调用

asession.run(*tasks)

这样,我们确保我们只将可调用对象传递给 run 方法,即列表的元素而不是列表本身。

靠!