Size: a a a

2021 January 07

RP

Roman Proskuryakov in Rust Async
можно запустить миллион функций и выполнять их по чуть-чуть
источник

RP

Roman Proskuryakov in Rust Async
Fortunato
Т.е. где-то уровнем (по стеку вызовов) выше должен быть не await, а какая-то штука, запускающая футуры конкурентно?
нууу... и да и нет
источник

RP

Roman Proskuryakov in Rust Async
сам .await не умееть параллелиться, но умеют комбинаторы futures:: join и select (ну или их какие-то самописные реализации)
источник

RP

Roman Proskuryakov in Rust Async
плюс сверху нужен планировщик, обычно в расте он называется executor
источник

RP

Roman Proskuryakov in Rust Async
вот это твое block_on(async_main()); - и есть запрос у планировщика на выполнение футуры, с возможностью выполнить это параллельно, если внутри есть join/select
источник

F

Fortunato in Rust Async
Roman Proskuryakov
плюс сверху нужен планировщик, обычно в расте он называется executor
Да, это я тоже понимаю
источник

F

Fortunato in Rust Async
Т.е. для конкуретного выполнения разных функций с await внутри, нужно плодить по потоку на каждую?
источник

F

Fortunato in Rust Async
Roman Proskuryakov
нууу... и да и нет
Не понял, почему "и нет"?
источник

RP

Roman Proskuryakov in Rust Async
можно плодить по потоку, например spawn в tokio или каких других рантаймов
источник

RP

Roman Proskuryakov in Rust Async
но можно и не плодить, достаточно пользоваться join/select.
источник

RP

Roman Proskuryakov in Rust Async
тебе уже 5 раз говорят про join/select, пожалуйста, не пропускай мимо ушей
источник

RP

Roman Proskuryakov in Rust Async
Fortunato
Осознаю асинк. Ниже пример из async book.
Я правильно понимаю, что управение перейдёт к sing_song(song) (3 строка), только когда до конца полностью отработает предыдущая строка, learn_song().await?
А пока learn_song().await заблокирована, то будет работать какая-то другая задача, но не сама функция learn_and_sing()?
async fn learn_and_sing() {
   let song = learn_song().await;
   sing_song(song).await;
}

async fn async_main() {
   let f1 = learn_and_sing();
   let f2 = dance();

   futures::join!(f1, f2);
}

fn main() {
   block_on(async_main());
}
да ты и сам join использовал
источник

F

Fortunato in Rust Async
Roman Proskuryakov
да ты и сам join использовал
Это ведь примеры из asynk book, я просто пытаюсь их раскурить
источник

F

Fortunato in Rust Async
Fortunato
Т.е. где-то уровнем (по стеку вызовов) выше должен быть не await, а какая-то штука, запускающая футуры конкурентно?
Т.е. вот это моё сообщение всё же верное? Хочешь чтоб несколько футур работали параллельно (sic!) - запускай их в join или select, так?
источник

RP

Roman Proskuryakov in Rust Async
join/select или spawn. ну или еще какие хитрые аналоги
источник

F

Fortunato in Rust Async
Хм... Хорошо, теперь стало ещё чуть яснее, спасибо
источник

D

Denis in Rust Async
Fortunato
Т.е. вот это моё сообщение всё же верное? Хочешь чтоб несколько футур работали параллельно (sic!) - запускай их в join или select, так?
они не будут  работать параллельно, они будут работать "по очереди"
источник

D

Denis in Rust Async
и каждый раз, когда ты где-то пишешь .await, создаётся потенциальная возможность другой таске поработать
источник

RP

Roman Proskuryakov in Rust Async
или yield... но это совсем другая история)
источник

D

Denis in Rust Async
ну да, когда генераторы завезут.. :)
источник