Ich habe eine Anwendung, in C++ geschrieben, die boost :: asio verwendet. Er wartet auf Anforderungen an einem Socket und führt für jede Anforderung eine CPU-gebundene Arbeit durch (z. B. keine Festplatte oder Netzwerk-E/A) und antwortet dann mit einer Antwort.Ich habe einen Server auf Sockets zuhören, was ist ein guter Ansatz, CPU-gebundene Anfragen mit mehreren Threads zu bedienen?
Diese Anwendung wird auf einem Multi-Core-System ausgeführt werden, so dass ich (mindestens) 1 Thread pro Kern planen, um Anfragen parallel zu verarbeiten.
Was ist der beste Ansatz hier? Dinge zu denken:
- ich eine feste Größe Thread-Pool benötigen (zB 1 Thread pro CPU)
- Werden mehr Anfragen kommen, als ich Threads haben, dann werden sie (vielleicht in die Warteschlange gestellt werden müssen ? o/s Sockets Layer)
Derzeit ist der Server Single-Threaded:
- es ist für eine Client-Anfrage wartet
- Sobald es eine erf erhält uest, führt es die Arbeit, und schreibt die Antwort zurück, dann für die nächste Anforderung beginnt warten
Update:
Genauer gesagt: was Mechanismus sollte ich das verwenden, um sicherzustellen, wenn der Server, dass eingehende besetzt ist Anfragen werden in die Warteschlange gestellt? Welchen Mechanismus sollte ich verwenden, um eingehende Anfragen auf die N Threads zu verteilen (1 pro Kern)?
Es sieht so aus "HTTP Server 3" auf dieser Seite könnte ein guter Ansatz sein: http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/examples.html#boost_asio.examples. http_server_3 –