Я новичок в повышении 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++
Программы на C++. Форум разработчиков
1749669157
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79662079/can-i-call-asioco-spawnioc-after-calling-ioc-run[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия