async_resolve
我想知道,如果我们在实践中运行多个调用,io_context
由于已知的限制,一次不会运行多个请求。
这是一个示例示例,我希望每个解析请求在等待 dns 响应返回时都会产生,并移至下一个请求,依此类推。
但从 Wireshark 来看,下一个解析似乎只有在前一个解析完成后才会执行。
boost::asio::ip::tcp::resolver resolver(io_ctx_);
const auto results1 = resolver.async_resolve(host1_, std::to_string(port1_), yield);
const auto results2 = resolver.async_resolve(host2_, std::to_string(port2_), yield);
const auto results3 = resolver.async_resolve(host3_, std::to_string(port3_), yield);
io_context
一次只处理一个解析请求吗?
您专门为每次调用让出并恢复协程。
您自己的协同例程是显式序列化调用的。
这是一个直接的、独立的重现:
住在科里鲁
打印例如
使用处理程序跟踪:
承诺
有很多方法可以解决这个问题,但让我
use_promise
在这里尝试“新”方法:住在科里鲁
相同的输出,但现在使用处理程序跟踪:
奖金
在 c++20 协程中使用可等待运算符通常更友好,并且不需要 Boost Context(或 Boost Coroutine):
住在科里鲁
或者使用并行组,特别是通过范围并行组使其动态化:
住在科里鲁
这两个 c++20 示例都会产生相同的执行结果: