#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