Eu queria saber se executarmos várias chamadas, async_resolve
na prática io_context
não executaremos mais de uma solicitação por vez devido a uma limitação conhecida.
Aqui está um exemplo de exemplo em que eu esperaria que cada solicitação de resolução rendesse enquanto espera o retorno da resposta do DNS e passa para a próxima solicitação e assim por diante.
mas olhando para o Wireshark parece que a próxima resolução é executada somente após a conclusão da anterior.
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);
Lida io_context
apenas com uma solicitação de resolução por vez?
Você produz e retoma especificamente a corrotina para cada invocação.
Sua própria co-rotina é o que serializa explicitamente as invocações.
Aqui está uma reprodução direta e independente:
Ao vivo no Coliru
Impressão, por exemplo
Usando o rastreamento do manipulador :
Promessas
Há muitas maneiras de consertar isso, mas deixe-me tentar a "nova"
use_promise
abordagem aqui:Ao vivo no Coliru
Mesma saída, mas agora usando rastreamento de manipulador:
BÔNUS
Usar operadores aguardáveis com corrotinas c++20 geralmente é mais amigável e não requer Boost Context (ou Boost Coroutine):
Ao vivo no Coliru
Ou use grupos paralelos , especificamente para torná-lo dinâmico com um grupo paralelo de longo alcance:
Ao vivo no Coliru
Ambos os exemplos do c++20 resultam em execução idêntica: