Фундаментальное отличие async await в python и javascript?

В python когда в asyncio запускаем таски, например эвейтим запрос в бд, пока этот запрос обрабатывается на сервере и идет ответ от него, python выполняет другие задачи чтобы не "спать" все это время. В javascript наоборот когда делаем эвейт, код дожидается выполнения текущей асинхронной функции и не идет дальше. Т.е асинхронность там и там, это совершенно разная асинхронность?

Поправьте меня, если я что-то не так написал. Пытаюсь разобраться в этом вопросе, прочитал много статей, пишу код и не могу понять что я упустил
  • Вопрос задан
  • 577 просмотров
Пригласить эксперта
Ответы на вопрос 3
Leo5878
@Leo5878
Улыбчивай, люблю учить и учиться
Если не использовать await, сразу после вызывоа функции, то она попадет в event loop. Но не все операции могут быть по настоящему асинхронными. На картинке хорошо отображено, то как это работает: 1*xm_WajiPlaOeJWcqgJb1xQ.png

Если например, это работа с сетью и сразу же не ожидать ответ, то код продолжит выполнение до того момента, пока данные не нужны будет, а получение данных по сети будет асинхронным
const data = fetch('http://exmapl.ecom');
// ... - какой-то код
await data()
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Разницы нет, в том числе в твоём описании.
Текущая корутина при await-вызове приостанавливается, её состояние сохраняется.
При этом реактор может заниматься другими вещами (в частности, выполнением await-вызова).
Когда await-вызов завершиться, состояние корутины будет восстановлено, и она продолжит выполнение.
Ответ написан
DollyPapper
@DollyPapper
Не могу сказать за Python, но не уверен, что вы правильно понимаете его механизм await. Сомневаюсь, что он продолжает выполнять текущий исполняемый поток после await, т.к. это нарушит исполение кода.
Про JS могу сказать, что вы видимо не до конца понимаете какой код будет исполнен действительно асинхронно, а какой последовательно (т.е. блокируя основной поток).
const axios = require('axios')

async function doReq1(){
    const res = await axios.get('http://localhost:12000?id=1')
    return res
}

async function main(){
    doReq1().then((data) => {
        console.log(data.data)
        console.log("After req")
    });
    console.log("Before req")
}
main()

Данный код выведет 1) Before req 2) Hello 1! 3) After req
Т.е. AfterReq будет исполнен после того как асинхронная операция получит результат, т.е. подождет (await) результата.
Аналогичный код с await
const axios = require('axios')

async function doReq1(){
    const res = await axios.get('http://localhost:12000?id=1')
    return res
}

async function main(){
    console.log("Before req")
    let res = await doReq1()
    console.log(res.data)
    console.log('After req')
}

main()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы