首页 > 解决方案 > 理解 Python async / await 与 Node js async / await 的比较

问题描述

我正在学习 Python 中的异步编程。我写了一些代码来模拟在 Python 和 Node 中获取 url;结果不同,我不知道为什么。

Python

async def asyncFunc():
   await asyncio.sleep(3)
   print('woke up...')

async def main():
    tasks = [asyncio.create_task( asyncFunc() ) for i in range(3)]

    for task in tasks:
        await task
        print('done waiting...')

asyncio.run(main())

结果:

woke up...
woke up...
woke up...
done waiting...
done waiting...
done waiting...

节点

const asyncFunc = async () => {
  await mySleepFunction(3);
  console.log('woke up...');
}

const main = async () => {
  for (let i = 0; i < 3; i++) {
    await asyncFunc();
    console.log('done waiting...');
  }
}

main();

结果

woke up...
done waiting...
woke up...
done waiting...
woke up...
done waiting...

节点结果是我所期望的。我的理解是,创建的任务在create_task等待(在 for 循环中)之前不会开始执行;但是如果第一个任务尚未完成,for 循环如何提前开始执行第二个任务?

感谢您对此的帮助

标签: pythonnode.jsasynchronousasync-await

解决方案


我的困惑来自于没有意识到这create_task是用来启动协同程序同时运行的。可以修改 Python 代码,以便通过省略create_task并只是等待任务来给出节点结果:

async def main():

  for task in tasks:
      await asyncFunc()
      print('done waiting...')

Usingcreate_task类似于Promise.all在 Node.js 中使用一系列 Promise


推荐阅读