Друзья, есть тут те, кто уже плотно работал с корутинами?
Вопрос в следующем, как корутинами организовать реальную асинхронную работу?
Получается, что у нас в любом случае останавливается контекст выполнения и переключается на контекст сопрограммы, где после выполнения каких-то операций идет возврат назад, продолжается выполнение первого контекста, но вопрос вот в чем, чтобы сделать асинхронную команду, после выполнения которой запускается callback можно использовать future async thread - все они завязаны на потоках, поэтому при вызове, потратят время и ресурсы на создание потока и займут где-то 2 МБ памяти для потока, приэтом, корутина потратит мало ресурсов для разворота стека для нее, но при этом она полностью останавливает контекст выполнения до определенного момента, пока не будет вызвано
coro.resume();
возможно ли как-то организовать, чтобы у нас несколько задач работали асинхронно, одновременно, при этом, чтобы было это неблокирующей операцией?
Например, есть таймер, который каждые 2 секунды пишет в лог какую-то информацию
Task log_info() {
while (true) {
std::cerr << some_info(); << std::endl;
co_await timer(2s);
}
}
и есть код, который асинхронно записывает что-то в бд и вызывает после этого callback
Task write_db(std::string info){
co_await async_write_db(info);
callback();
}
При этом, если мы вызовем так:
int main() {
log_info();
write_db("A");
}
то
write_db никогда
не выполнится, так как
log_info
займет
весь поток
сюда по любому придется подключать потоки? и как это грамотнее реализовать?
Надеюсь понятно описал)