Я новичок в повышении Asio, Coroutines (и Redis). Я создаю прототип клиента Redis, использующего Boost Redis, который построен на вершине Asio и Coroutines. Я думаю, что мой класс может удерживать IO_CONTEXT (и подключение Redis), и в его конструкторе будет запускать контекст в новом потоке. Призыв к методу записи будет реализован путем вызова co_spawn - и будет выполнен контекстом в потоке, созданном в конструкторе. Например, я понятия не имею, безопасен ли в iO в безопасности или есть какой -то более тонкую проблему в этом подходе. Вторичный вопрос заключается в том, является ли это разумным подходом или существует установленная шаблон дизайна для этой проблемы. Альтернативой будет сигнализация коратики, чтобы как -то проснуться, возможно, используя таймер в качестве механизма сигнализации (например, как это). Однако мне нравится идея порождения новой коратики, поскольку она проста, и нет необходимости управлять состоянием, разделенным между потоками. Хотя это работает, опять же, я нуб для Asio /Coroutines и не знаю, разумно ли это. < /P>
auto
co_ping(shared_ptr conn, string str) -> asio::awaitable
{
request req;
req.push("PING", std::move(str));
response resp;
co_await conn->async_exec(req, resp, asio::deferred_t{});
SPDLOG_INFO("PING: {}", std::get(resp).value());
}
int
main(int argc, char* argv[])
{
config cfg;
if (argc == 3) {
cfg.addr.host = argv[1];
cfg.addr.port = argv[2];
}
asio::io_context ioc;
auto conn = std::make_shared(ioc);
conn->async_run(cfg, {}, asio::consign(asio::detached, conn));
SPDLOG_INFO("Spawn 1 -- before event loop started");
asio::co_spawn(ioc, co_ping(conn, "Hello 1"), asio::detached);
auto fut = std::async(
std::launch::async,
[&ioc]() {
SPDLOG_INFO("ioc run start");
ioc.run(); // start event loop
SPDLOG_INFO("ioc run end");
});
SPDLOG_INFO("Wait for ioc run on secondary thread");
std::this_thread::sleep_for(std::chrono::milliseconds{100});
SPDLOG_INFO("Spawn 2 -- after event loop started");
asio::co_spawn(ioc, co_ping(conn, "Hello 2"), asio::detached);
SPDLOG_INFO("Wait for pings");
std::this_thread::sleep_for(std::chrono::milliseconds{500});
SPDLOG_INFO("Cancel");
conn->cancel();
return 0;
}
< /code>
output, отметить [console] < /code> /[ioc] < /code> Показывает поток Main /ioc, работающий < /p>
[2025-06-11T16:01:03.278+01:00] [main.cpp:61] [main] [console] [info] Spawn 1 -- before event loop started
[2025-06-11T16:01:03.279+01:00] [main.cpp:73] [main] [console] [info] Wait for ioc run on secondary thread
[2025-06-11T16:01:03.279+01:00] [main.cpp:69] [main::::operator ()] [ioc] [info] ioc run start
[2025-06-11T16:01:03.281+01:00] [main.cpp:38] [co_ping] [ioc] [info] PING: Hello 1
[2025-06-11T16:01:03.395+01:00] [main.cpp:76] [main] [console] [info] Spawn 2 -- after event loop started
[2025-06-11T16:01:03.395+01:00] [main.cpp:86] [main] [console] [info] Wait for pings
[2025-06-11T16:01:03.396+01:00] [main.cpp:38] [co_ping] [ioc] [info] PING: Hello 2
[2025-06-11T16:01:03.902+01:00] [main.cpp:88] [main] [console] [info] Cancel
[2025-06-11T16:01:03.904+01:00] [main.cpp:71] [main::::operator ()] [ioc] [info] ioc run end
Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-ioc-run
Могу ли я позвонить в Asio :: co_spawn (ioc, ...) после вызова ioc.run () ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение