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

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

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

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

18 ответов

15 просмотров

Вроде же реализация экзекутора — это не часть раста, а отдана на откуп библиотекам (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--()
Ну ок. А что именно в плане комбинаторов? Они же п...

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Здравствуйте. Задача состоит в том, чтобы сделать real-time чат в мобильном приложении. После передачи сообщения пользователем через веб-сокеты, для основного и долговременног...
🐾
5
Где можно найти примеры эффективного "асинхронного" tcp сервера на C? Я видел select, kqueue, poll, epoll и т.д. Ввод-вывод неблокирующий, но обработка клиентов блокирующая
#
10
Книга Юрова В.И пойдёт для обучения?
Botsman
24
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Hi Everyone! To all Are you Looking for Interview Support at the Lowest Price? Look no further! Then contact us 👉We offer Interview Support :-for a low cost variety of tech...
Rambabu Nallamilli
3
Hello experts, Could someone kindly tell me how to run vacuum inside a plpgsql function? If you have any link please share. Thank you
Amol Palav
10
И ещё вопрос: можно ли типа как на дос как-то запариться и с помощью прерываний выводить текст, вместо функции printf ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
34
Карта сайта