Я использую boost::asio::spawn
, чтобы запустить сопрограмму
boost::asio::io_context ioc;
boost::asio::steady_timer timer(ioc);
boost::asio::ip::tcp::socket socket(ioc);
boost::asio::io_context::strand strand(ioc);
......
boost::asio::spawn(strand, [&](boost::asio::yield_context yield)
{
while(true){
http::async_write(socket, req_indicators, yield);
http::async_read(socket, buffer, res, yield);
// do something with res
timer.expires_after(interval);
timer.async_wait(yield);
}
}
......
Теперь я хочу немедленно отменить эту сопрограмму (не дожидаясь истечения таймера и проверки флага), не останавливая весь ioc
, потому что в той же цепи работают другие сопрограммы.
Я могу позвонить timer.cancel()
и socket.close()
вместе, но, поскольку сопрограмма усложняется, я должен отслеживать все, что может вызвать выход в сопрограмме, что утомительно и подвержено ошибкам. Есть ли способ безоговорочно остановить сопрограмму, созданную boost::asio::spawn
, как у asyncio.task.cancel()
?
в python