Re[42]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 10:33
Оценка:
Здравствуйте, 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>>
EP>>async([]{ DoAction(); }).then([=]
EP>>{
EP>>    synchronization_context_post( [=]{ coro.un_yield(); } );
EP>>}); // without syntax sugar
EP>>coro.yield();
EP>>

I>И снова торчит та самая асинхронщина, которая, как ты утверждал, нигде не торчит ?

1. without syntax sugar
2. Это может быть на нижних уровнях, без изменения интерфейса выше. Внутри TcpStream, показанного выше, о ужас, тоже есть yield

EP>>Неважно где будет выполнятся асинхронная операция — в отдельном потоке или позже в этом, главное чтобы была возможность присоединить продолжение в виде:

EP>>
EP>>synchronization_context_post( [=]{ coro.un_yield(); } );
EP>>

I>То есть, делать все что может сделать компилятор, но руками.

Сделать тоже самое один раз, и спрятать в либу

I>Итого — одним сообщением ты взял все свои слова назад


ты уныл, чесслово

I>В сухом остатке, так сказать, все по прежнему — все что надо, в С++ пилится и контролируется руками, в сигнатуре и коде торчит ровно то же, что торчит в C#.


балабольство — ты так и не показал аналог кода на C##
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— так что сравнивать не с чем
Re[40]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 10:51
Оценка:
Здравствуйте, 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>То есть, синхронный код с нелькальными переходами.

То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?

EP>>Ничто не мешает закинуть post_event с unyield'ом корутины в конец нового потока Уже надоело объяснять банальные вещи

I>Ну да, лучше делать руками то, что может легко сделать компилятор

Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.
Руками это делать не обязательно — это всё прячется в библиотеку.
Re[41]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 12:19
Оценка:
Здравствуйте, 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>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?


Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.

EP>Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.


От тебя никто не просил показывать, что происходит унутре. Нужно было написать 5 строчек кода что бы показать как используется message pump.
alex_public так и сделал, а ты пошел рассказывать непойми что.

EP>Руками это делать не обязательно — это всё прячется в библиотеку.


Спасибо, капитан ! Буду знать, что на С++ можно писать библиотеки.
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 12:53
Оценка:
Здравствуйте, 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##
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— так что сравнивать не с чем


Балабольство это когда ты две недели кряду не можешь понять, что в твоем коде только нелокальные переходы и синхронный код.

Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:

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";
...

}
Re[42]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 12:56
Оценка:
Здравствуйте, 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>>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?

I>Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.

async_something/async_download — это "асинхронщина"?

EP>>Я объяснил в деталях что происходит под капотом, ибо уже >30 страниц дискуссии — а до тебя только сейчас начинает доходить.

I>От тебя никто не просил показывать, что происходит унутре. Нужно было написать 5 строчек кода что бы показать как используется message pump.

Уфф — ты прикидываешься или действительно всё так плохо?
Ещё раз, есть операция async_something (которая допустим что-то выполняет в pool'е), принимающая продолжение:
async_something([=]{ on_completion(); });

Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.
Я уже ни раз показывал
Автор: Evgeny.Panasyuk
Дата: 27.06.13
что этот вызов async_something механически трансформируется на корутины.

I>>>Ну да, лучше делать руками то, что может легко сделать компилятор

EP>>Руками это делать не обязательно — это всё прячется в библиотеку.
I>Спасибо, капитан ! Буду знать, что на С++ можно писать библиотеки.

теперь ты перестанешь ныть об "лучше делать руками то, что может легко сделать компилятор"?
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 13:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>То есть пример с await download это не "асинхронщина"?


Асинхронщина, т.к. скачивание обычно делатется не из строчки, которую ты подложил в стрим в другом месте, а из источника, у которого изначально другое время.

EP>>>То есть ты до сих пор не понял, как происходит описанная локальная трансформация
Автор: Evgeny.Panasyuk
Дата: 27.06.13
, и то что async_something может быть любым?

I>>Это и есть нелокальный переход. Ты его путаешь с асинхронщиной.

EP>async_something/async_download — это "асинхронщина"?


См выше.

EP>Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.

EP>Я уже ни раз показывал
Автор: Evgeny.Panasyuk
Дата: 27.06.13
что этот вызов async_something механически трансформируется на корутины.


Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?


EP>теперь ты перестанешь ныть об "лучше делать руками то, что может легко сделать компилятор"?


Это ж ты повторяешь это как максиму.
Re[44]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 13:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.

EP>>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?
I>Очевидно, нет.

Почему?

I>>>Покажи каким образом буст узнает про message pump.

EP>>Зачем Boost'у знать про message pump?
I>Затем, что когда ты вошел в свой getline и конкретная нить зависла в нём, одна из других нитей должна крутить message pump, как вариант. Ты это яростно отрицал примерно до сегодняшнего дня.

Boost не нужно никак модифицировать
Пример со сторонним message pump я показал 25 июня
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— ты его до сих пор не осилил.
Там как раз примерно такая же локальная трансформация:
s_.async_read_some(
        boost::asio::buffer( buffer_ + pb_size, bf_size - pb_size),
        boost::bind( & coro_t::operator(), & coro_, _1, _2) );
ca_();

Как управление передастся из message pump опять в эту корутину — это проблемы async_read_some, причём эта передача управления должна произойти как с корутинами так и без(в продолжение), поэтому не имеет отношения к дискуссии coroutine/await

I>>>Очень просто. твой пример с getline именно это и демонстрирует. Если ты делаешь вызов с ожиданием, то надо РУКАМИ пнуть message pump. В С# это делает компилятор.

EP>>В C#'пе нужный message pump выбирается глобальным synchronization context'ом, что и я и artelk пытались тебе растолковать
I>Не гони, ты ничего кроме "все работает само" нигде не говорил.
I>Вызов через synchronization context это явное обращение к message pump и это деляет компилятор.

Ты действительно не понимаешь, что:
Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );

подходит под описанную концепцию async_something
Автор: Evgeny.Panasyuk
Дата: 27.06.13
?
async_something([=]{ on_completion(); });
// ...
void async_something(CompletionHandler ch)
{
    Task(calc).then(on_global_sync_context, ch );
}

Или ты думаешь что асинхронного кода с обычными продолжениями на C++ вообще нет?

Ты действительно не понимаешь, что такой async_something
Автор: Evgeny.Panasyuk
Дата: 29.06.13
:
template<typename F>
void async_something(F f)
{
    on_minization = f;
}

принципиально (в рамках дискуссии coroutine/await) ничем не отличается от event_queue.post(f); ?

EP>>Ничто не мешает иметь такой же глобальный synchronization context

I>Я боюсь что для этого придется написать сначала аналог .Net framework

Ещё раз, такого типа код:
Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );

механически трансформируется на корутины — в нём уже есть этот самый synchronization context

I>или сделать так, что бы буст стал стандартом C++.


Зачем?

I>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:


I>
I>void foo(Stream stream)
I>{
I>    string msg;
I>    do
I>    {
I>        msg = getline(stream);
I>        Trace.WriteLine(msg); 
I>    } while(msg != "exit");
I>}
I>


1. facepalm, как ты запустишь несколько foo в одном потоке?
2. покажи полный код, а не эти огрызки
Re[44]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 13:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>То есть пример с await download это не "асинхронщина"?

I>Асинхронщина, т.к. скачивание обычно делатется не из строчки, которую ты подложил в стрим в другом месте, а из источника, у которого изначально другое время.

Так, небольшой сдвиг уже есть.
Идём дальше, мелкими шажками:
async_download(address).then(sync_context, [=]{ on_completion(); } );

Это "асинхронщина"?

А это:
void async_something(Handler h)
{
    async_download(address).then(sync_context, h);
}
// ...
async_something([=]{ on_completion(); });

?

EP>>Ещё раз, есть операция async_something (которая допустим что-то выполняет в pool'е), принимающая продолжение:

EP>>
async_something([=]{ on_completion(); });

EP>>Продолжение вызывается в UI потоке — как именно (по глобальному synchronization context, или ещё как) — это всё детали, которые не зависят от того используется-ли корутины для выпрямления кода или обычные continuations.
EP>>Я уже ни раз показывал
Автор: Evgeny.Panasyuk
Дата: 27.06.13
что этот вызов async_something механически трансформируется на корутины.

I>Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?

Я правильно понимаю, что до тебя до сих пор не дошло, что это всё ортогональные детали спрятанные в async_something (которые точно также присутствуют в коде без корутин)?
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 14:23
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

I>>>>Я утверждаю, что ты показал эмуляцию асинхронщины, а не саму асинхронщину, то есть, синхъронный код с нелокальные переходами.

EP>>>В случае с await у тебя тоже "синхъронный код с нелокальные переходами" ?
I>>Очевидно, нет.

EP>Почему?


если чтото навроде f = await Task.FromResult(13) то очевидно, будут только нелокальные переходы.

Собтсвенно это никому не интересно, т.к. нелокальными переходами никого не удивишь.

EP>Boost не нужно никак модифицировать


А разве я говорю что его надо модифицировать ? Нужно всего лишь сказать бусту, что он должен чего то вызвать.

EP>Пример со сторонним message pump я показал 25 июня
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— ты его до сих пор не осилил.


Там снова нет никакого упоминания 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>Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );
EP>

EP>подходит под описанную концепцию async_something
Автор: Evgeny.Panasyuk
Дата: 27.06.13
?


Ты лучше подумай чем отличатеся эвент-дривен от асинхронщины. Для тебя похоже это одно и то же.

EP>Или ты думаешь что асинхронного кода с обычными продолжениями на C++ вообще нет?


Нет, я так не думаю. Ты похоже вообще не понимаешь, про что мы тут разговариваем.

EP>принципиально (в рамках дискуссии coroutine/await) ничем не отличается от event_queue.post(f); ?


Принципиально твои примеры это синхронный код с нелокальным переходом. Убираешь весь мусор и все работает само. Это никому не интересно.

EP>>>Ничто не мешает иметь такой же глобальный synchronization context

I>>Я боюсь что для этого придется написать сначала аналог .Net framework

EP>Ещё раз, такого типа код:

EP>
EP>Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );
EP>

EP>механически трансформируется на корутины — в нём уже есть этот самый synchronization context

Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит вперемешку с плачем "в С++ можно писать библиотеки"

I>>или сделать так, что бы буст стал стандартом C++.


EP>Зачем?


затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.

I>>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:


I>>
I>>void foo(Stream stream)
I>>{
I>>    string msg;
I>>    do
I>>    {
I>>        msg = getline(stream);
I>>        Trace.WriteLine(msg); 
I>>    } while(msg != "exit");
I>>}
I>>


EP>1. facepalm, как ты запустишь несколько foo в одном потоке?


Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах

Ликбез находится здесь:
http://dabeaz.com/coroutines/
Код на питоне, короутины переписываются почти один к одному

Но вообще можно и без короутин

EP>2. покажи полный код, а не эти огрызки


Не, такой фокус не выйдет, ибо я не получил от тебя ничего на случай твоего getline и моего message pump:

while(::GetMessage(&msg))
{
  ::DispatchMessage(msg);
}

И один из хандлеров внезапно вызывает getline вот так

getline(stream, &result) // здесь нить ожидает результата и вместе с ней висит message pump выше -> UI Thread блокирован для вызовов извне, соответсвенно нужно что бы другая нить вызвала этот самый message pump
Re[45]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 14:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Так, небольшой сдвиг уже есть.

EP>Идём дальше, мелкими шажками:
EP>
EP>async_download(address).then(sync_context, [=]{ on_completion(); } );
EP>

EP>Это "асинхронщина"?

Если async_download скачивает не из строчек, заранее приготовленых, а по честному, то да. Обычные continuations, которые были до async/await.
Сравни:
await async_download(address);
on_completion();



I>>Ты сам то заметил, что в твоем коде нет вообще никакого message pump ?


EP>Я правильно понимаю, что до тебя до сих пор не дошло, что это всё ортогональные детали спрятанные в async_something (которые точно также присутствуют в коде без корутин)?


Хватит уже басни рассказывать. Делов то — взять МОЙ message pump и показать как он вызовется, пока getline будет ожидать результата.
Re[42]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 14:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Я уже решил завязать с этой дискуссией, т.к. всё уже сказано и если кто-то ещё не понял, то только из-за своей непробиваемости. ))) Но сейчас всё же вмешаюсь, т.к. я вижу что вроде бы и ты и 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'а с добавлением какого-то механизма инициации асинхронного вызова.
Re[46]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 14:53
Оценка:
Здравствуйте, Ikemefula, Вы писали:

EP>>Пример со сторонним message pump я показал 25 июня
Автор: Evgeny.Panasyuk
Дата: 25.06.13
— ты его до сих пор не осилил.

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>>Task(() -> calc()).then(on_global_sync_context, () -> on_completion() );
EP>>

EP>>механически трансформируется на корутины — в нём уже есть этот самый synchronization context
I>Это уже неинтерсно, потому что сначала ты рассказывал что нигде ничего не торчит

...и показал конкретный пример с TcpStream — там действительно ничего не торчит, yield'ы только на самом нижнем уровне

I>>>или сделать так, что бы буст стал стандартом C++.

EP>>Зачем?
I>затем, что есть код который ничего не знает ни про твои контексты, ни про message pump.

Ещё раз, корутины позволяют распрямить код который вызывает асинхронные операции.
Контексты и message-pump-ы есть и до распрямления, очевидно же

I>>>Итак, поскольку сегодня ты наконец согласился, что в твоем коде ничего кроме нелокальных переходов нет, то все нужно это заюзать нелокальные переходы из С#:

I>>>
I>>>void foo(Stream stream)
I>>>{
I>>>    string msg;
I>>>    do
I>>>    {
I>>>        msg = getline(stream);
I>>>        Trace.WriteLine(msg); 
I>>>    } while(msg != "exit");
I>>>}
I>>>

EP>>1. facepalm, как ты запустишь несколько foo в одном потоке?
I>Теперь ты уже просишь не один вызов, как было у тебя, а коорперативную многозадачность в явном виде ? Это так же реализуемо, представь себе весь ужас, на stackless короутинах

Чукчка не читатель?
Давай, перечитывай
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

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


EP>>2. покажи полный код, а не эти огрызки

I>Не, такой фокус не выйдет

я ничего другого кроме передёргивания от тебя и не ожидал
Re[43]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 15:03
Оценка:
Здравствуйте, 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);
Re[46]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 15:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Если async_download скачивает не из строчек, заранее приготовленых, а по честному, то да.


Пример из Boost.Asio, на который я неоднократно ссылался, считывает данные из tcp порта, куда уж честнее
Пример win32 с событиями, реагирует на "честные" события minimize, которые инициируются пользователем, у которого очевидно "время отличное от времени центрального процессора"
Re[44]: Что посоветуете как аналог С++
От: alex_public  
Дата: 07.07.13 15:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>await внутри точно также навешивает completion callback:


Ну да, но там:
1. возможны только такие callback'и
2. это уже реализовано

Соответственно твои примеры в сравнение с await/async:
1. более обобщённые (что Ikemefula не хочет видеть)
2. недоделанные (на что Ikemefula и упирает последние n страниц)
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 15:57
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Evgeny.Panasyuk показывал в большинстве случаев вообще другие примеры, не имеющие прямого отношения к await/async, но при этом однозначно являющиеся примерами асинхронного программирования.


Это просто примеры event driven кода, их можно прикрутить к асинхронщине, но сами они не являются асинхронщиной.
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 16:00
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Пример win32 с событиями, реагирует на "честные" события minimize, которые инициируются пользователем, у которого очевидно "время отличное от времени центрального процессора"


При этом весь мусор из твоего кода можно выбросить, и все будет работать. Вот так пример !
Re[47]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 16:08
Оценка:
Здравствуйте, 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>Давай, перечитывай
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

EP>

EP>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).


getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.
Что бы он отработал асинхронно, надо обернуть вызов в asynchronous([]=>{getline();});

Соответсвенно ты просишь КООПЕРАТИВНУЮ МНОГОЗАДАЧНОСТЬ, а не асинхронщину, пора бы уже это понять.
Я трижды спрашивал тебя, чего ты хочешь, а ты никак не можешь понять, что асинхронщины, эвент-дривен и коорперативная многоздачность это три разные вещи.

I>>Не, такой фокус не выйдет


EP>я ничего другого кроме передёргивания от тебя и не ожидал


На себя смотри, две недели бегаешь от одного примера.
Re[43]: Что посоветуете как аналог С++
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 07.07.13 16:12
Оценка: :))
Здравствуйте, 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 почему то называете такой хлам асинхронщиной
Re[48]: Что посоветуете как аналог С++
От: Evgeny.Panasyuk Россия  
Дата: 07.07.13 16:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:


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>>Давай, перечитывай
Автор: Evgeny.Panasyuk
Дата: 25.06.13
:

EP>>

EP>>getline выполняется асинхронно, давай возможность другим соединениям отработать (поток один).

I>getline в твоем примере выполняется СИНХРОННО. Это значит, что следующая строчка после getline получит результат ПОСЛЕ того, как getline вернет управление.

1. Asynchronous I/O:

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 вернет управление"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.