172 похожих чатов

Почему в расте для асинхронности используется пуллинг? Почему нельзя напрямую

по очереди продолжать асинхронные функции, после выполнения вложенных асинхронных функций?

Например в контексте вложенных g(f(x)) при выполнении f(x), делать resume g(f(x))?

18 ответов

21 просмотр

Вроде же реализация экзекутора — это не часть раста, а отдана на откуп библиотекам (tokio, async_std, etc.)?

Потому что так проще сохранять стейт, afaik continuation-based асинк без гц достаточно замороченно делать. Плюс в poll-based можно всё на статических вызовах zero cost сделать, а с continuation тебе так или иначе придётся функции по указателям выполнять.

вафля'
Потому что так проще сохранять стейт, afaik contin...

As a nice side effect: в раст асинке стэк трейс имеет смысл

'xet-void operator--() Автор вопроса
вафля'
Потому что так проще сохранять стейт, afaik contin...

А в каком плане zero cost? я не совсем понимаю

'xet void operator--()
А в каком плане zero cost? я не совсем понимаю

В том плане, что статический вызов очевиден компилятору и он может его оптимизировать как хочет. Например заинлайнить. Ты за него (почти) не платишь. Динамик диспатч относительно сильно более дорогой

Хм а в каких языках сделано иначе и при этом эффективнее?

'xet-void operator--() Автор вопроса
Lite Combo
Хм а в каких языках сделано иначе и при этом эффек...

хз, но теоритически это не будет эффективнее?

Lite Combo
Хм а в каких языках сделано иначе и при этом эффек...

То что там метод называется пулл не значит что там постоянно что-то опрашивает. Там вейкер пробуждает когда задача выполнена

вафля'
Потому что так проще сохранять стейт, afaik contin...

нет, ты на пуш-бейзд футурах же такой же полноценный (растовый) асинк можешь реализовать

'xet void operator--()
А в каком плане zero cost? я не совсем понимаю

В плане что одна футура которая вызывает 10 футур через асинк авейт и другая где все накопипащено в тело дадут один перформанс. Если сравнить в шарповыми футурами или жсовыми промисами то там каждый авейт делается на отдельную футуру которая будет ллоцированна и дергаться отдельно

http://aturon.github.io/tech/2016/09/07/futures-design/

'xet-void operator--() Автор вопроса

возьмем жс: const foo = async () => { await do1(); await do2(): } const bar = async () => { await do3(); await do4(): } const baz = async () => { await foo(); await bar(): } тут футуры foo и bar будут сущестовать реально - они будут аллоцированны, и будут дергать resolve по выполнению. Теперь если мы возьмем раст то async fn foo() { do1().await; do2.await; } async fn bar() { do3().await; do4.await; } async fn baz() { foo().await; bar.await; } Оно вместо того чтобы реально дергать в рантайме как тут написано перепишет в стейтмашину вида async fn baz() { do1().await; do2.await; do3().await; do4.await;} Имеет право оно сделать именно из-за модели поллинга, с комплишном так сделать не получится насколько я помню. В итоге никаких аллокаций и лишних прыжков. Другой плюс это отмена пендинг операций - с комплишном это геморрой с передачей всяких CancellationToken'ов которые нужно мониторить и т.п. В расте эе просто делаешь drop(future) и она автоматом отменится. Ну короч почитай ссылку что я кидал, там все написано

Αλεχ Zhukovsky
http://aturon.github.io/tech/2016/09/07/futures-de...

не очень понятно написано если честно. Опять проблема double linked структур в расте.

Αλεχ Zhukovsky
возьмем жс: const foo = async () => { await do1()...

Как будто в расте канцелоятион токены не нужны

Dmytro Polunin
Как будто в расте канцелоятион токены не нужны

можно просто дроп, если ты эту операцию не в отдельном треде пустил

'xet-void operator--() Автор вопроса
Αλεχ Zhukovsky
возьмем жс: const foo = async () => { await do1()...

Ну ок. А что именно в плане комбинаторов? Они же по идеи будут не очень оптимальны?

'xet void operator--()
Ну ок. А что именно в плане комбинаторов? Они же п...

любая комбинация авейтов любой вложенности по сути с компилируется в единственную стейт машину с одним гигантским свитчем на всё что должно произойти за время выполнения всей футуры

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта