学习异步:异步运行具有延迟的功能

时间:2020-07-13 17:15:11

标签: python asynchronous async-await python-asyncio

我已经尝试学习异步几天了,但是我无法使该示例函数正常工作。我想加快发出几百个HTTP请求的速度,但我想从简单开始。我希望能够指定我想要多少个请求。在进行调整时,我遇到了许多不同的错误,但是我无法正常工作。

这是我的代码:

import asyncio
import time

async def say():
  print("Started")
  await time.sleep(3) #something that takes a long time like an http request
  print("Finsihed")

loop = asyncio.get_event_loop()
asyncio.gather(say(),say(),say())
loop.run_forever()

我对此非常满意,并且可以肯定我在运行循环时做错了什么,但是我不知道下一步该怎么做。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题:

  • 您不能在异步代码中使用time.sleep(),因为调用time.sleep()之类的阻塞函数会阻塞整个事件循环。
  • 您不能仅调用asyncio.gather(),必须等待它。
  • 您可能应该使用更新且更健壮的asyncio.run() API,而不是较旧的loop.run_forever()

以下是修正了这些问题的代码:

import asyncio

async def say():
    print("Started")
    await asyncio.sleep(3)
    print("Finsihed")

async def main():
    await asyncio.gather(say(), say(), say())

asyncio.run(main())

还请注意,您将需要使用aiohttp之类的可感知异步的库来正确使用asyncio。