Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, artelk, Вы писали:
Во-первых, спасибо!
Во-вторых, придирки:
На сколько удалось распарсить, у каждого рабочего потока своя очередь. Нафига?
Кстати, а почему он один? Остальные ядра процессора тупо простаивать будут, в то время как к нашему сервису целая толпа клиентских запросов в очередь выстроилась?
EP>По умолчанию, await возвращается в main_context, но точку возврата для текущей корутины можно поменять через switch_context_to. В данном примере, часть корутин после выполнения задания worker_context'ом "просыпается" в нём же.
По умолчанию, после асинхронной IO операции, управление возвращается в исходный поток пула, так? А если он будет занят чем-то другим к этому моменту (какой-нибудь длительной синхронной операцией), ждать пока освободится (в то время как остальные потоки пула могут быть свободны)?
Или нужно не давать потоку ничего делать, пока операция не закончится? Так это же блокировкой называется, будет по потоку на запрос.
А если не по умолчанию, нужно указать конкретный поток в котором нужно будет продолжится? Дык, та же проблема.
UPD: Хотелось бы, чтоб по завершению IO операции можно было вообще не уходить\перескакивать из IOCP потока, до тех пор, пока не потребуется — т.е. будет запущена другая асинхронная операция, выполняющая продолжение в рабочих потоках пула (т.е. Task.Run, Task.Delay и т.п.) — лишние переключения не нужны.
EP>// await is not limited by "one level" as in C#
Всмысле?
void reschedule()
{
boost::this_thread::sleep_for(boost::chrono::milliseconds( rand() % 2000 ));
}
auto some_async_operation()
{
return async([]{ return reschedule(), 1; });
}
Тут создание и блокировка потока будет, правильно? Task.Delay(N) работает хитрее — текущий поток освобождается и возвращается в пул. Продолжение будет добавлено в очередь заданий через N ms. Нет такого, что на каждый Task.Delay тратится по потоку на ожидание\засыпание.
EP>// Full emulation of await feature from C# language in C++ based on Stackful Coroutines from
EP>// Boost.Coroutine library.
Пока рано такие заголовки вставлять
A>>Хотелось бы увидеть образцово-показательный код на С++, чтобы в качестве сервисного метода было, например, что-то вроде такого:
A>>A>>async Task<byte[]> GetValue(byte[] bytes)//bytes - пришедшие от клиента данные
A>>{
A>>...
A>>}
A>>
A>>На сколько реализуемо?
EP>Не пойму что концептуально нового добавляет этот пример по сравнению с предыдущим.
Мечталось погонять готовый сервис на предмет масштабируемости.