Здравствуйте, Ikemefula, Вы писали:
I>>>Остался один открытый вопрос — сделать так, что бы буст, наконец, узнал про message pump. EP>>ты действительно не понял, что трансформация полностью локальная? I>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.
В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?
I>>>>UI поток заблокируется, потому что буст не знает про message pump. В этом потоке будет чтото выполняться, при чем не ясно, как указать что именно должно выполняться. EP>>Тебе что-то неясно != "UI поток заблокируется" I>Покажи каким образом буст узнает про message pump.
Зачем Boost'у знать про message pump?
EP>>Почему завис на корутинах? Ты о чём? I>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.
В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать
Ничто не мешает иметь такой же глобальный synchronization context
EP>>То и на stackful coroutines никто не заставляет всё пилить в одном потоке: EP>>
I>И снова торчит та самая асинхронщина, которая, как ты утверждал, нигде не торчит ?
1. without syntax sugar
2. Это может быть на нижних уровнях, без изменения интерфейса выше. Внутри TcpStream, показанного выше, о ужас, тоже есть yield
EP>>Неважно где будет выполнятся асинхронная операция — в отдельном потоке или позже в этом, главное чтобы была возможность присоединить продолжение в виде: EP>>
I>То есть, делать все что может сделать компилятор, но руками.
Сделать тоже самое один раз, и спрятать в либу
I>Итого — одним сообщением ты взял все свои слова назад
ты уныл, чесслово
I>В сухом остатке, так сказать, все по прежнему — все что надо, в С++ пилится и контролируется руками, в сигнатуре и коде торчит ровно то же, что торчит в C#.
Здравствуйте, Ikemefula, Вы писали:
I>>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер EP>>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop I>Тот где торчит asynchronous или тот где getline ?
с win32 окнами
EP>>У асинхронных операций есть callback'и принимающие продолжения, вот в этот callback и нырнёт наша корутина — event loop это никак не трогает — всё полностью локально I>То есть, вместо линейного кода на ровном месте получаются continuations
Ты не поверишь, при использовании await под капотом точно такие же continuations.
Так и тут continuations прячутся под капот, пользовательский код остаётся линейным
EP>>То есть по твоему "асинхронщина" — это только выполнение в отдельном потоке? I>Асинхронщина это обращение к некоторой сущности, у которой время отличное от времени центрального процессора. Все что ты показывал, это просто другая форма эвентов, т.е. все выполняется в одном процессоре а стало быть асинхронщины нет и быть не может, только эмуляция. I>То есть, синхронный код с нелькальными переходами.
, и то что async_something может быть любым?
EP>>Ничто не мешает закинуть post_event с unyield'ом корутины в конец нового потока Уже надоело объяснять банальные вещи I>Ну да, лучше делать руками то, что может легко сделать компилятор
Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.
Руками это делать не обязательно — это всё прячется в библиотеку.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Ikemefula, Вы писали:
I>>>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер EP>>>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop I>>Тот где торчит asynchronous или тот где getline ?
EP>с win32 окнами
EP>Ты не поверишь, при использовании await под капотом точно такие же continuations. EP>Так и тут continuations прячутся под капот, пользовательский код остаётся линейным
Это неважно, "какая унутре неонка"
это просто другая форма эвентов, т.е. все выполняется в одном процессоре а стало быть асинхронщины нет и быть не может, только эмуляция. I>>То есть, синхронный код с нелькальными переходами.
EP>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.
EP>Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.
От тебя никто не просил показывать, что происходит унутре. Нужно было написать 5 строчек кода что бы показать как используется message pump.
alex_public так и сделал, а ты пошел рассказывать непойми что.
EP>Руками это делать не обязательно — это всё прячется в библиотеку.
Спасибо, капитан ! Буду знать, что на С++ можно писать библиотеки.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
I>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.
EP>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?
Очевидно, нет.
I>>Покажи каким образом буст узнает про message pump.
EP>Зачем Boost'у знать про message pump?
Затем, что когда ты вошел в свой getline и конкретная нить зависла в нём, одна из других нитей должна крутить message pump, как вариант. Ты это яростно отрицал примерно до сегодняшнего дня.
I>>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.
EP>В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать
Не гони, ты ничего кроме "все работает само" нигде не говорил.
Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.
EP>Ничто не мешает иметь такой же глобальный synchronization context
Я боюсь что для этого придется написать сначала аналог .Net framework или сделать так, что бы буст стал стандартом C++.
EP>>>То и на stackful coroutines никто не заставляет всё пилить в одном потоке:
I>>И снова торчит та самая асинхронщина, которая, как ты утверждал, нигде не торчит ?
EP>1. without syntax sugar
Естественно, ведь в С++ у тебя ничего нет и все надо колбасить руками.
EP>2. Это может быть на нижних уровнях, без изменения интерфейса выше. Внутри TcpStream, показанного выше, о ужас, тоже есть yield
Серия 155 увлекальтельной истории "на С++ можно писать библиотеки"
I>>То есть, делать все что может сделать компилятор, но руками. EP>Сделать тоже самое один раз, и спрятать в либу
Серия 156 увлекальтельной истории "на С++ можно писать библиотеки"
I>>В сухом остатке, так сказать, все по прежнему — все что надо, в С++ пилится и контролируется руками, в сигнатуре и коде торчит ровно то же, что торчит в C#.
EP>балабольство — ты так и не показал аналог кода на C##
Балабольство это когда ты две недели кряду не можешь понять, что в твоем коде только нелокальные переходы и синхронный код.
Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:
void foo(Stream stream)
{
string msg;
do
{
msg = getline(stream);
Trace.WriteLine(msg);
} while(msg != "exit");
}
Вариант 1: генераторы
IEnumerable<string> StrinsForStream()
{
yield return"1";
}
foo(new StreamFromEnumerable (StrinsForStream()));
class StreamFromEnumerable : Stream
{
...
if(strings.MoveNext())
return strings.Current;
else
return"exit";
...
}
Вариант 3: эвенты
foo(new StreamFromEvents (()=>GetNextString()));
class StreamFromEvents : Stream
{
...
return strings.RequestNextString() ?? "exit";
...
}
Вариант 3: олдскульноее ООП, которое есть даже в Джаве, Джаваскрипте и где угодно
class StringsRequester : IStringsRequester
{
string IStringsRequester.Next()
{
... // return все что хочешь и как хочешь
}
}
foo(new StreamFrom(new StringsRequester());
class StreamFrom : Stream
{
...
return stringRequester.Next() ?? "exit";
...
}
Здравствуйте, Ikemefula, Вы писали:
I>>>>>Ну это просто вранье. alex_public показал, как event-loop "не меняется" — путем встраивания RunAll в event loop или прикручивая таймер EP>>>>Так я же выше показывал пример с полностью локальной трансформацией, без модификации event-loop I>>>Тот где торчит asynchronous или тот где getline ? EP>>с win32 окнами EP>>Ты не поверишь, при использовании await под капотом точно такие же continuations. EP>>Так и тут continuations прячутся под капот, пользовательский код остаётся линейным I>Это неважно, "какая унутре неонка" I>это просто другая форма эвентов, т.е. все выполняется в одном процессоре а стало быть асинхронщины нет и быть не может, только эмуляция.
То есть пример с await download это не "асинхронщина"?
I>>>То есть, синхронный код с нелькальными переходами. EP>>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
, и то что async_something может быть любым? I>Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.
async_something/async_download — это "асинхронщина"?
EP>>Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить. I>От тебя никто не просил показывать, что происходит унутре. Нужно было написать 5 строчек кода что бы показать как используется message pump.
Уфф — ты прикидываешься или действительно всё так плохо?
Ещё раз, есть операция async_something (которая допустим что-то выполняет в pool'е), принимающая продолжение:
async_something([=]{ on_completion(); });
Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.
Я уже ни раз показывал
что этот вызов async_something механически трансформируется на корутины.
I>>>Ну да, лучше делать руками то, что может легко сделать компилятор EP>>Руками это делать не обязательно — это всё прячется в библиотеку. I>Спасибо, капитан ! Буду знать, что на С++ можно писать библиотеки.
теперь ты перестанешь ныть об "лучше делать руками то, что может легко сделать компилятор"?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>То есть пример с await download это не "асинхронщина"?
Асинхронщина, т.к. скачивание обычно делатется не из строчки, которую ты подложил в стрим в другом месте, а из источника, у которого изначально другое время.
EP>>>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
, и то что async_something может быть любым? I>>Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.
EP>async_something/async_download — это "асинхронщина"?
См выше.
EP>Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations. EP>Я уже ни раз показывал
Здравствуйте, Ikemefula, Вы писали:
I>>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами. EP>>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ? I>Очевидно, нет.
Почему?
I>>>Покажи каким образом буст узнает про message pump. EP>>Зачем Boost'у знать про message pump? I>Затем, что когда ты вошел в свой getline и конкретная нить зависла в нём, одна из других нитей должна крутить message pump, как вариант. Ты это яростно отрицал примерно до сегодняшнего дня.
Boost не нужно никак модифицировать
Пример со сторонним message pump я показал 25 июня
Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some, причём эта передача управления должна произойти как с корутинами так и без(в продолжение), поэтому не имеет отношения к дискуссии coroutine/await
I>>>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор. EP>>В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать I>Не гони, ты ничего кроме "все работает само" нигде не говорил. I>Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.
принципиально (в рамках дискуссии coroutine/await) ничем не отличается от event_queue.post(f); ?
EP>>Ничто не мешает иметь такой же глобальный synchronization context I>Я боюсь что для этого придется написать сначала аналог .Net framework
механически трансформируется на корутины — в нём уже есть этот самый synchronization context
I>или сделать так, что бы буст стал стандартом C++.
Зачем?
I>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:
I>
Здравствуйте, Ikemefula, Вы писали:
EP>>То есть пример с await download это не "асинхронщина"? I>Асинхронщина, т.к. скачивание обычно делатется не из строчки, которую ты подложил в стрим в другом месте, а из источника, у которого изначально другое время.
Так, небольшой сдвиг уже есть.
Идём дальше, мелкими шажками:
?
EP>>Ещё раз, есть операция async_something (которая допустим что-то выполняет в pool'е), принимающая продолжение: EP>>
async_something([=]{ on_completion(); });
EP>>Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations. EP>>Я уже ни раз показывал
что этот вызов async_something механически трансформируется на корутины. I>Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?
Я правильно понимаю, что до тебя до сих пор не дошло, что это всё ортогональные детали спрятанные в async_something (которые точно также присутствуют в коде без корутин)?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
I>>>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами. EP>>>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ? I>>Очевидно, нет.
EP>Почему?
если чтото навроде f = await Task.FromResult(13) то очевидно, будут только нелокальные переходы.
Собтсвенно это никому не интересно, т.к. нелокальными переходами никого не удивишь.
EP>Boost не нужно никак модифицировать
А разве я говорю что его надо модифицировать ? Нужно всего лишь сказать бусту, что он должен чего то вызвать.
EP>Пример со сторонним message pump я показал 25 июня
Там снова нет никакого упоминания message pump. Я сколько ни приводил пример message pump ты так внятно ничего и не сказал.
EP>Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some
Не управление из message pump, а управление после вызова твоей функции навроде getline
нить вызывает getline и висит, пока её не отпустят, поскольку она вызвалась из message pump то висит и message pump
I>>Не гони, ты ничего кроме "все работает само" нигде не говорил. I>>Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.
EP>Ты действительно не понимаешь, что: EP>
Ты лучше подумай чем отличатеся эвент-дривен от асинхронщины. Для тебя похоже это одно и то же.
EP>Или ты думаешь что асинхронного кода с обычными продолжениями на C++ вообще нет?
Нет, я так не думаю. Ты похоже вообще не понимаешь, про что мы тут разговариваем.
EP>принципиально (в рамках дискуссии coroutine/await) ничем не отличается от event_queue.post(f); ?
Принципиально твои примеры это синхронный код с нелокальным переходом. Убираешь весь мусор и все работает само. Это никому не интересно.
EP>>>Ничто не мешает иметь такой же глобальный synchronization context I>>Я боюсь что для этого придется написать сначала аналог .Net framework
EP>Ещё раз, такого типа код: EP>
EP>механически трансформируется на корутины — в нём уже есть этот самый synchronization context
Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит вперемешку с плачем "в С++ можно писать библиотеки"
I>>или сделать так, что бы буст стал стандартом C++.
EP>Зачем?
затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.
I>>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:
I>>
EP>1. facepalm, как ты запустишь несколько foo в одном потоке?
Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах
Но вообще можно и без короутин
EP>2. покажи полный код, а не эти огрызки
Не, такой фокус не выйдет, ибо я не получил от тебя ничего на случай твоего getline и моего message pump:
while(::GetMessage(&msg))
{
::DispatchMessage(msg);
}
И один из хандлеров внезапно вызывает getline вот так
getline(stream, &result) // здесь нить ожидает результата и вместе с ней висит message pump выше -> UI Thread блокирован для вызовов извне, соответсвенно нужно что бы другая нить вызвала этот самый message pump
Если async_download скачивает не из строчек, заранее приготовленых, а по честному, то да. Обычные continuations, которые были до async/await.
Сравни:
await async_download(address);
on_completion();
I>>Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?
EP>Я правильно понимаю, что до тебя до сих пор не дошло, что это всё ортогональные детали спрятанные в async_something (которые точно также присутствуют в коде без корутин)?
Хватит уже басни рассказывать. Делов то — взять МОЙ message pump и показать как он вызовется, пока getline будет ожидать результата.
Я уже решил завязать с этой дискуссией, т.к. всё уже сказано и если кто-то ещё не понял, то только из-за своей непробиваемости. ))) Но сейчас всё же вмешаюсь, т.к. я вижу что вроде бы и ты и Evgeny.Panasyuk пишете правильные вещи, но при этом в упор не понимаете друг друга... )))
Я показывал в этой темке примеры на C++ полностью повторяющие C# реализацию await/async. Только при этом они были гибче, удобнее и эффективнее, но это уже другой вопрос. А с тем, что это полный аналог, вроде ни у кого возражений не было.
Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная. Соответственно Evgeny.Panasyuk показал что можно красиво и удобно записывать такой код с помощью сопроцедур (из Boost'a), превращая их в линейный, без выделения спец. функции для callback'a.
Так что:
1. Примеры Evgeny.Panasyuk'а действительно не являются аналогами await/async C#.
2. Но при этом однозначно являются примерами асинхронного программирования
3. Насколько я понимаю, сделать аналоги примеров Evgeny.Panasyuk'а на C# await/async вообще не реально. Так что это были весьма важные примеры для данной дискуссии — они показывают где реализация мощнее.
P.S. Да, кстати, моя реализация полного аналога C# await/async в принципе сводится к примерами Evgeny.Panasyuk'а с добавлением какого-то механизма инициации асинхронного вызова.
— ты его до сих пор не осилил. I>Там снова нет никакого упоминания message pump. Я сколько ни приводил пример message pump ты так внятно ничего и не сказал.
очевидно, что message pump внутри asio
EP>>Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some I>Не управление из message pump, а управление после вызова твоей функции навроде getline I>нить вызывает getline и висит, пока её не отпустят, поскольку она вызвалась из message pump то висит и message pump
getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump
EP>>>>Ничто не мешает иметь такой же глобальный synchronization context I>>>Я боюсь что для этого придется написать сначала аналог .Net framework EP>>Ещё раз, такого типа код: EP>>
EP>>механически трансформируется на корутины — в нём уже есть этот самый synchronization context I>Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит
...и показал конкретный пример с TcpStream — там действительно ничего не торчит, yield'ы только на самом нижнем уровне
I>>>или сделать так, что бы буст стал стандартом C++. EP>>Зачем? I>затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.
Ещё раз, корутины позволяют распрямить код который вызывает асинхронные операции.
Контексты и message-pump-ы есть и до распрямления, очевидно же
I>>>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#: I>>>
EP>>1. facepalm, как ты запустишь несколько foo в одном потоке? I>Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах
Здравствуйте, alex_public, Вы писали:
_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная.
await внутри точно также навешивает completion callback:
//Schedules the state machine to proceed
//to the next action when the specified awaiter completes.
//Also: sending this state machine here will trigger it's boxing into heap.this.<>t__builder.AwaitUnsafeOnCompleted<TaskAwaiter<string>,
AsyncMethods.<DownloadHtmlAsyncTask>d__0>(ref taskAwaiter, ref this);
Здравствуйте, Ikemefula, Вы писали:
I>Если async_download скачивает не из строчек, заранее приготовленых, а по честному, то да.
Пример из Boost.Asio, на который я неоднократно ссылался, считывает данные из tcp порта, куда уж честнее
Пример win32 с событиями, реагирует на "честные" события minimize, которые инициируются пользователем, у которого очевидно "время отличное от времени центрального процессора"
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>await внутри точно также навешивает completion callback:
Ну да, но там:
1. возможны только такие callback'и
2. это уже реализовано
Соответственно твои примеры в сравнение с await/async:
1. более обобщённые (что Ikemefula не хочет видеть)
2. недоделанные (на что Ikemefula и упирает последние n страниц)
Здравствуйте, alex_public, Вы писали:
_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования.
Это просто примеры event driven кода, их можно прикрутить к асинхронщине, но сами они не являются асинхронщиной.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Пример win32 с событиями, реагирует на "честные" события minimize, которые инициируются пользователем, у которого очевидно "время отличное от времени центрального процессора"
При этом весь мусор из твоего кода можно выбросить, и все будет работать. Вот так пример !
Здравствуйте, Evgeny.Panasyuk, Вы писали:
I>>Там снова нет никакого упоминания message pump. Я сколько ни приводил пример message pump ты так внятно ничего и не сказал.
EP>очевидно, что message pump внутри asio
Очевидно, что такой message pump никому не нужен, кроме boost.asio, т.е. message pump всегда требует дополнительных вещей.
EP>getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump
Ну а до того цикл будет висеть, правильно ? Вопрос — как его запустить ДО того как getline вернет управление.
I>>Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит
I>>затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.
EP>Ещё раз, корутины позволяют распрямить код который вызывает асинхронные операции.
Спасибо, капитан !
EP>Контексты и message-pump-ы есть и до распрямления, очевидно же
От тебя требовался один пример явной работы с message pump, а вместо этого ты ударился в порталы и прочие картинки.
EP>>>1. facepalm, как ты запустишь несколько foo в одном потоке? I>>Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах
EP>Чукчка не читатель? EP>Давай, перечитывай
EP>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).
getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.
Что бы он отработал асинхронно, надо обернуть вызов в asynchronous([]=>{getline();});
Соответсвенно ты просишь КООПЕРАТИВНУЮ МНОГОЗАДАЧНОСТЬ, а не асинхронщину, пора бы уже это понять.
Я трижды спрашивал тебя, чего ты хочешь, а ты никак не можешь понять, что асинхронщины, эвент-дривен и коорперативная многоздачность это три разные вещи.
I>>Не, такой фокус не выйдет
EP>я ничего другого кроме передёргивания от тебя и не ожидал
На себя смотри, две недели бегаешь от одного примера.
Здравствуйте, alex_public, Вы писали:
_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования. Это случаи когда у нас есть некий callback, вызываемый откуда-то снаружи (например из ОС). Это на самом деле вполне часто встречающаяся задача и как раз асинхронная. Соответственно Evgeny.Panasyuk показал что можно красиво и удобно записывать такой код с помощью сопроцедур (из Boost'a), превращая их в линейный, без выделения спец. функции для callback'a.
function getSin(param, end)
{
end(Math.sin(param));
}
getSin(45, function(result){ ля ля ля})
вот этот вызов выглядит как асинхронный, при этом в данном примере нет ничего асинхронного, обычный event driven подоход, а вы с EP почему то называете такой хлам асинхронщиной
EP>>getline дёрнет TcpStream, который вызовет yield, после которого управление вернётся в message pump I>Ну а до того цикл будет висеть, правильно ?
До yield'а? Ну да, так же как и до await'а
I>Вопрос — как его запустить ДО того как getline вернет управление.
Вернёт управление куда? в while цикл с getline'ом? Ну так message pump и так запустится до этого, сразу после yield'а внутри TcpStream
EP>>Контексты и message-pump-ы есть и до распрямления, очевидно же I>От тебя требовался один пример явной работы с message pump
Был не один пример с message pump'ом — и с asio'вским, и с win32, и даже с самодельным
I>а вместо этого ты ударился в порталы и прочие картинки.
и даже они не помогли тебе понять
EP>>Чукчка не читатель? EP>>Давай, перечитывай
EP>>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).
I>getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.
Asynchronous I/O, in computer science, is a form of input/output processing that permits other processing to continue before the transmission has finished.
2. Если по-твоему строчка getline выполняется "СИНХРОННО", то и строчка await async_download:
await async_download(address);
on_completion();
также выполняется синхронно? ведь "следующая строчка после getline await async_download получит результат ПОСЛЕ того, как getline await async_download вернет управление"