Могу ли я позвонить в Asio :: co_spawn (ioc, ...) после вызова ioc.run ()C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Могу ли я позвонить в Asio :: co_spawn (ioc, ...) после вызова ioc.run ()

Сообщение Anonymous »

Я новичок в повышении 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Могу ли я позвонить в Asio :: Co_spawn (IOC, ...) в отдельном потоке после блокировки вызова в ioc.run ()
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Соединение не может быть завершено в Linux boost::asio::spawn
    Anonymous » » в форуме Linux
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Как я могу рефакторировать старые звонки Asio Asio
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как я могу рефакторировать старые звонки Asio Asio
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как я могу рефакторировать старые звонки Asio Asio
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»