Size: a a a

2021 April 21

W

Warstone in Modern::Perl
await ожидает когда то что он ждет случится. Почему это что-то случится - его не волнует.
источник

W

Warstone in Modern::Perl
Если говорить в парадигме C# (просто я знаком с await внутри C# больше) на высоком уровне, то await ждет когда таску (который он ждет) вызовут SetResult(...) (по памяти пишу. Может API отличается).
источник

AS

Alexey Stavrov in Modern::Perl
Мне не понятно, как наличие стейт машины избавляет нас от 100% CPU load
источник

AS

Alexey Stavrov in Modern::Perl
Ага, вот я слышал, что в c# какая-то эталонная реализация async/await, но как там чо работает не знаю.
источник

W

Warstone in Modern::Perl
А если говорить на низком уровне то await в C# не ждет ничего. Так как любой async код компилируется в стейт машину (там прям класс получается, где все локальные переменные являются чуть-ли не паблик пропертями класса) с одной точкой входа с параметром state. А await это такой забавный метод записать case XXX: внутри switch(state) который внутри метода "выполнить".
источник

AS

Alexey Stavrov in Modern::Perl
Ну т.е. если из event loop выкинуть цикл событий, то в htop мы непременно увидим 100% cpu load)
источник

W

Warstone in Modern::Perl
Никак. Это разные вещи.
источник

W

Warstone in Modern::Perl
Вы себя слышите? Если из event loop выкинуть цикл событий(переводится как event loop на английский) то мы получим моментальный выход из программы.
источник

AS

Alexey Stavrov in Modern::Perl
Блин, ну какой же вы недогадливый.
Пусть цикл событий реализован с помощью poll. Вот если в цикле событий выкинуть вызов poll, то будет 100% cpu load.
Так более правильно или есть ещё к чему придраться?
источник

W

Warstone in Modern::Perl
Откуда я знаю какие тараканы у вас в голове. Штатные телепаты ушли работать с больными Node.js
источник

W

Warstone in Modern::Perl
Отвечая на эту фразу да. Более того ни одно событие никогда на случится, так как там будет while(true) {} и?
источник

AS

Alexey Stavrov in Modern::Perl
Блин, видимо недостаточно для вас подробно.

Давайте добавим ещё в цикл while обход по всем дискрипторам, которые у вас есть с правильной обработкой EAGAIN ошибки.

А сейчас лучше?)
источник

W

Warstone in Modern::Perl
Не совсем, так как ждать можно не только сокеты (внезапно).
Ну и если вы каждый раз будете пробовать прочесть что-то (или записать), то да - будет 100% cpu load
источник

b

basiliscos in Modern::Perl
На днях видел код, который по сути делает так на спец. задании "Task" + Sleep + interrupt. Плюсовый код выглядет так:

struct MyTask: Task {
 void run() override {
   while(true) {
     // do things...
     sleep(1);
   }
 }
}


ну и работает это на 1 проце. Подозреваю, что дается просто interrupt в sleep, а дальше запоминается стек, и переключается на другой таск... и так на N тасков на 1 проце.
источник

W

Warstone in Modern::Perl
Только непонятно причем тут async и/или yield
источник

W

Warstone in Modern::Perl
ммм... sleep перебит в локальных хедерах и там просиходит попытка отдать управление другой нити со спасением стека? )))
источник

AS

Alexey Stavrov in Modern::Perl
Вы сами стали писать, что там без цикла событий в с#

Дальнейшие вопросы к Вам не привели к какой-то понятной картине.

Yeild/await в том, что я видел, содержал внутри себя event loop.
источник

W

Warstone in Modern::Perl
Еще раз... yield(научитесь уже писать хотя-бы правильно это слово) и async/await не имеют никакого отношения к эвент лупу.
источник

W

Warstone in Modern::Perl
Да, они часто используются вместе. Но они ортогональны
источник

AS

Alexey Stavrov in Modern::Perl
Опять вы придераетесь. Мне не интересно дальше вести диалог
источник