无法理解这段代码中的异步点。这是应该如何运作的吗?

时间:2019-06-05 19:16:22

标签: python-3.x asynchronous async-await python-asyncio

我正在尝试使用asyncio lib来尝试让我的代码“同时”发出3个HTTP GET / POST请求,以便尽快获得响应。 (有时一个或另一个请求被延迟,最终导致下一个请求延迟。)

所以我去了asyncio文档,发现了这个例子:https://docs.python.org/3/library/asyncio-task.html#coroutines

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    print(f"started at {time.strftime('%X')}")

    await say_after(1, 'hello')
    await say_after(2, 'world')

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

我实际上适应了我自己,但是它似乎并没有帮助,只是使代码更加复杂而没有任何上升空间。

(上面)测试示例代码时,我假设如果我增加了第一个say_after()的延迟时间,第二个将首先打印

    await say_after(5, 'hello') #5 seconds of sleep before print
    await say_after(2, 'world')

但是,没有。返回是:

  

从16:04:30开始

     

你好

     

世界

     

完成于16:04:37

那么这个异步代码的目的是什么?如果没有异步,我可能会有相同的结果:

def say_after_b(delay, what):
    time.sleep(delay)
    print(what)

def main_b():
    print(f"started at {time.strftime('%X')}")

    say_after_b(5, 'hello')
    say_after_b(2, 'world')

    print(f"finished at {time.strftime('%X')}")

main_b()

返回:

  

始于16:04:37

     

你好

     

世界

     

完成于16:04:44

我看待异步代码的方式随着时间的增加应该像这样:

睡眠1秒>睡眠2秒> print('world')>睡眠3秒>睡眠4秒>睡眠5秒> print('hello')>结束。

我的假设错了吗?

1 个答案:

答案 0 :(得分:1)

在您提到的文档中再阅读一遍。

在您引用的示例代码上方,它清楚地说明了

  

以下代码段将在等待1秒钟后打印“ hello”,然后在等待另外2秒钟后打印“ world”

下一个示例是

  

同时运行两个say_after协程

(提示:您需要创建任务以同时运行协程)