Понимание асинхронности / ожидания Python по сравнению с асинхронностью / ожиданием узла js

#python #node.js #asynchronous #async-await

#python #node.js #асинхронный #асинхронность-ожидание

Вопрос:

Я изучаю асинхронное программирование на Python. Я написал некоторый код для имитации выборки URL-адресов в Python и Node; результаты разные, и я не уверен, почему.

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, чтобы начать выполнение второй задачи, если первая задача еще не завершена?

спасибо за вашу помощь в этом

Комментарии:

1. Обратите внимание, что если вы, в Node.js версия, сначала создайте «задачу» ( Promise ), добавьте ее в массив, затем ожидайте ее в цикле, результат будет тот же.

2. спасибо за понимание. Я думаю, что разница как-то связана с тем фактом, что в Node обещания «нетерпеливы».

Ответ №1:

Мое замешательство возникло из-за того, что я не понимал, что create_task это используется для одновременного запуска сопрограмм. Код Python может быть изменен таким образом, чтобы он выдавал результаты узла, опуская create_task и вместо этого просто ожидая задачи:

 async def main():

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

Использование create_task аналогично использованию Promise.all для массива обещаний в Node.js

Комментарии:

1. Просто примечание здесь: рассмотрите возможность следования рекомендациям по кодированию на Python при соответствующем использовании рекомендаций Python и других языков. asyncFunc имя должно быть переведено на async_func в мире Python