HTTP-Clients in diesem speziellen Fall "Via-Http-lib" zu integrieren, um
Zwecke zu lernen, und es kompiliert und funktioniert. Dieser LIB bietet einen nicht blockierenden HTTP
-Client, der von ASIO unter der Motorhaube betrieben wird, und verwendet Rückrufe für das Ereignis
Handling. Machen Sie mehrere Get -Anfragen nacheinander, trotz
Code: Select all
co_awaiting< /code> sie. Ich glaube, das [url=viewtopic.php?t=19220]Problem[/url] ist, dass ASIO
blockiert, solange eine Verbindung
aktiv.
in dem über - lib ist, wird eine Verbindung geschlossen, wenn keine Daten mehr vorhanden sind. Dieser
sollte irgendwann der Fall sein. Es erreicht jedoch nie einen 2.
Code: Select all
co_await HttpClient::GET
nach io_context.run () < /code>. Interessanterweise habe ich gelernt, dass, wenn ich einen weiteren
Thread-Switch füge, z. Wickeln Sie den Co_AWAIT REQ < /code> in zwischen 2
Thread-Switching Co_AWAITS ein. Es scheint, dass ich so viele GET-Anforderungen ausführen kann, wie ich
will, und selbst wenn ich 10000 GET-Anforderungen schleife, habe ich nicht mehr als 4 Threads
(laut Windows 'Task Manager). Trotzdem kann es nicht die richtige Lösung sein. Der springende Punkt von Async und
coroutines.
Leider habe ich 0 Erfahrung mit ASIO und ich frage mich, wie man es ordnungsgemäß in meinen Anwendungsfall integriert. Ich dachte, der springende Punkt von ASIO besteht darin, die asynchronisierte Arbeit zu ermöglichen. Die ASIO -Beispiele, die ich gefunden habe, sind jedoch nur Verfahrensprogramme, die auf
oberes Level ausgeführt wurden, zum Beispiel einen einzelnen Einsatz oder die Hauptschleife. Allerdings nenne ich ASIO in meinem objektorientierten Programm und übersetze die Verwendung nicht entsprechend ... < /p>
Code: Select all
HttpResponseTask HttpClient::GET(const std::string& uri) const
{
auto req = HttpRequest(host_, uri);
co_await continue_on_new_thread();
auto data = co_await req;
co_await continue_on_new_thread();
co_return data;
}
< /code>
co_await req
Code: Select all
std::coroutine_handle HttpRequest::await_suspend(std::coroutine_handle h)
{
std::osyncstream(std::cout) remote_address();
connection->send(std::move(response), std::move(response_body));
} else
std::cerr