Python中异步/等待和同步方式的结果没有区别

时间:2020-07-26 20:36:53

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

我编写了以下代码:

import asyncio

async def write_after(pause,text):
  print('begin')
  await asyncio.sleep(pause)
  print(text)

async def main():
  await write_after(1,'Hello...')
  await write_after(2,'...world')

asyncio.run(main())

结果我得到了:

begin
Hello...
begin
...world

,在begin秒后暂停。我想知道为什么结果不是:

begin
begin
Hello...
...world

类似于使用任务的执行程序。

2 个答案:

答案 0 :(得分:1)

基本上,正在发生的事情是您在等待第一个结果完成,然后开始第二个函数调用并等待该结果。我认为您所期望的是这样的:

import asyncio

async def write_after(pause,text):
  print('begin')
  await asyncio.sleep(pause)
  print(text)

async def main():
  await asyncio.gather(
    write_after(1,'Hello...'),
    write_after(2,'...world')
  )

asyncio.run(main())

这将同时启动两个协程并等待每个协程的结果。结果将是:

begin
begin
Hello...
...world

答案 1 :(得分:1)

@kingkupps分析是正确的。不幸的是,myy asyncio模块没有run方法(Python 3.7),因此可以选择:

import asyncio

async def write_after(pause,text):
  print('begin')
  await asyncio.sleep(pause)
  print(text)

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(
        asyncio.gather(
            write_after(1, 'Hello'),
            write_after(2, '...world')
        )
    )

main()

打印:

begin
begin
Hello
...world