So verbinden Sie ASIO blockieren io_context mit CoroutinenC++

Programme in C++. Entwicklerforum
Anonymous
 So verbinden Sie ASIO blockieren io_context mit Coroutinen

Post by Anonymous »

Ich spiele also mit Coroutinen herum und habe es geschafft, einen Drittanbieter
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 
io_context
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
. Genauer gesagt erreicht es den Code nie direkt
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
verwendet meine wartbare httprequest -Implementierung:

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post