我正在尝试使用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')>结束。
我的假设错了吗?
答案 0 :(得分:1)
在您提到的文档中再阅读一遍。
在您引用的示例代码上方,它清楚地说明了
以下代码段将在等待1秒钟后打印“ hello”,然后在等待另外2秒钟后打印“ world”
下一个示例是
同时运行两个say_after协程
(提示:您需要创建任务以同时运行协程)