Size: a a a

2020 September 12

11

123 123 in Rust Async
Mikail Bagishov
Ты волнуешься по поводу излишнего потребления памяти (типа, структура содержит два поля под переменные, хотя в реальности больше одного не нужно)?
Нет, я волнуюсь о том что исходя из примера по ссылке, два потенциально несвязанных async`а влияют друг на друга, и один блокирует выполнение другого. Скорее всего я ошибаюсь, только не знаю, что я упускаю из вида
источник

11

123 123 in Rust Async
Можно как-то посмотреть на конечный результат преобразования уже в state-machine кода, но без ассемблера?
источник

AI

Alex Ilizarov in Rust Async
123 123
Можно как-то посмотреть на конечный результат преобразования уже в state-machine кода, но без ассемблера?
На playground можешь попробовать mir глянуть
источник

AI

Alex Ilizarov in Rust Async
123 123
Нет, я волнуюсь о том что исходя из примера по ссылке, два потенциально несвязанных async`а влияют друг на друга, и один блокирует выполнение другого. Скорее всего я ошибаюсь, только не знаю, что я упускаю из вида
Ну так через join запускай оба если они друг от друга не зависят
источник

АГ

Алексей Герасимов... in Rust Async
123 123
Вот тут: https://rust-lang.github.io/async-book/04_pinning/01_chapter.html показывают как из асинхронного кода создается state-machine. Насколько я понял, каждый .await в рамках этого блока будет полем конечной структуры, для которой уже будет сделан impl Future for.В связи с чем такой вопрос: если у меня данные условного первого поля структуры никак не зависят от данных второго поля такой структуры, но первое поле исполняется дальше, то исходя из приведенного примера в скинутом линке напрашивается вывод, что второе поле не будет обработано, пока не обработается первое поле. Это так, или я ошибаюсь?
последовательные await исполняются последоватьельно, никакой конкурентности в их исполнении нет. То есть если ты хочешь совершить два сетевых запроса, причем для совершения второго не нужно дожидаться первого, то надо это «распараллеливание» делать самому, два последовательных get(«http://foo.com»).await; get(«http://bar.com»).await будут исполняться последовательно
источник

11

123 123 in Rust Async
Т.е если я явно нигде в коде не взываю task::spawn и других вещей, то мой код будет все такой же синхронный, только при этом рализован в виде state machine?
источник

m

magras in Rust Async
Алексей Герасимов
последовательные await исполняются последоватьельно, никакой конкурентности в их исполнении нет. То есть если ты хочешь совершить два сетевых запроса, причем для совершения второго не нужно дожидаться первого, то надо это «распараллеливание» делать самому, два последовательных get(«http://foo.com»).await; get(«http://bar.com»).await будут исполняться последовательно
Но код вида
let foo = get(«http://foo.com»);
let bar = get(«http://bar.com»);
foo.await;
bar.await;

в начале отправит оба запроса и только потом встанет на ожидании первого ответа.
источник

IT

Ilya Titkov in Rust Async
magras
Но код вида
let foo = get(«http://foo.com»);
let bar = get(«http://bar.com»);
foo.await;
bar.await;

в начале отправит оба запроса и только потом встанет на ожидании первого ответа.
Если гет - асинк функция, то это не так
источник

t

this is not mrklf in Rust Async
magras
Но код вида
let foo = get(«http://foo.com»);
let bar = get(«http://bar.com»);
foo.await;
bar.await;

в начале отправит оба запроса и только потом встанет на ожидании первого ответа.
Нет,
источник

IT

Ilya Titkov in Rust Async
Асинк функции ленивые же и ничего не делают просто так, их надо авейтнуть или заспавнить
источник

IT

Ilya Titkov in Rust Async
magras
Но код вида
let foo = get(«http://foo.com»);
let bar = get(«http://bar.com»);
foo.await;
bar.await;

в начале отправит оба запроса и только потом встанет на ожидании первого ответа.
Чтобы тут запросы выполнялись параллельно надо использовать join https://docs.rs/futures/0.3.5/futures/macro.join.html
источник

m

magras in Rust Async
Да, я не прав. Я думал о ситуации когда get является базовым примитивом вроде read.
источник

m

magras in Rust Async
Кстати я никогда не задумывался об этом. Получается в расте нельзя реализовать get так чтобы он жадно отправил запрос и только после этого засаспендился?
источник

IT

Ilya Titkov in Rust Async
Ну можно сделать, чтобы гет взвращала impl Future, а внутри нее делать tokio::spawn()
fn get() -> impl Future<Output=String> {
 tokio::spawn(actual_get())
}
типа так
источник

AI

Alex Ilizarov in Rust Async
magras
Кстати я никогда не задумывался об этом. Получается в расте нельзя реализовать get так чтобы он жадно отправил запрос и только после этого засаспендился?
Такое ощущение что ты корутины хочешь. Вроде какие то движки для этого есть
источник

m

magras in Rust Async
Ilya Titkov
Ну можно сделать, чтобы гет взвращала impl Future, а внутри нее делать tokio::spawn()
fn get() -> impl Future<Output=String> {
 tokio::spawn(actual_get())
}
типа так
Да, наверное, не async функция решает эту задачу. Спасибо.
источник

АГ

Алексей Герасимов... in Rust Async
magras
Кстати я никогда не задумывался об этом. Получается в расте нельзя реализовать get так чтобы он жадно отправил запрос и только после этого засаспендился?
можно написать не-async функцию, которая возвращает Future, делая некоторое количество действий синхронно, а не заворачивая весь код в футуру, соответственно в нем можно инициировать запрос, а наружу отдать только футуру которая будет ждать ответа, но это очень скользкая дорожка, вызывающий возможно ожидает что такой вызов будет полностью ленивым
источник

11

123 123 in Rust Async
Т.е если я явно нигде в коде не взываю task::spawn и других вещей, то мой код будет все такой же синхронный, только при этом рализован в виде state machine? Ну и еще event-loop будет при этом?
источник

OA

Oleg Andreev in Rust Async
123 123
Т.е если я явно нигде в коде не взываю task::spawn и других вещей, то мой код будет все такой же синхронный, только при этом рализован в виде state machine? Ну и еще event-loop будет при этом?
если у тебя в коде нигде нет task::spawn а только футуры и async/await, то твой код - это хитрожопая пассивная стейт-машина, которую будет поллить кто-то другой
источник

OA

Oleg Andreev in Rust Async
т.е. кто-то сделает task::spawn, и в нем начнет вызывать твою либу, которая внутри своих футур будет трекать состояние от одного I/O к другому.
источник