Lernprojekt - Webserver: Threads oder nicht Threads?
-
Hi,
ich schreibe grade aus lernzwecken einen eigenen Webserver mit Sockets. Ich kann auch schon mit meinem kleinen Projekt Requests empfangen, auswerten und einen Response senden. *stolz ist*
Die Darstellung einer Web-Seite besteht ja in der Regel aus mehreren Requests. z. B. einmal die Hauptseite, dann ein Request für das Logo, dann für eine CSS-Datei usw. usw.
Leider kann ich (noch) nicht diese Requests gleichzeitig verarbeiten. Jetzt habe ich mal etwas rumgesucht und mir wurden 2 Dinge genannt, wobei die Socket-"Fraktionen" die "Socket-Select-Methode" bevorzugen und die Threading-"Fraktionen" die Threads selber.
Aus meiner Amateursicht schenken die beiden sich irgendwie gar nichts. Also ich seh bei Threads keinen Vorteil zu einem Socket-Select oder umgekehrt.
Nun die Frage: was würde sich _generell_ für einen Webserver am ehesten eigenen von den beiden Techniken und vorallem: warum?
Hoffe ihr könnt mir bei diesem "Problemchen" helfen.
Viele Grüße,
EventCoder.
-
Beides funktioniert. Wenn das Dein erster Webserver ist, nimm einen Worker-Thread pro Client.
Zu diesem Thema gibt es eine Menge Streitereien von Leuten, die nur wenig Erfahrung mit großen Webservern haben, im Netz. Das hier ist in meinen Augen ein sehr guter Startpunkt der ganz gut erklärt, was Dich vmtl. interessiert: http://www.kegel.com/c10k.html
-
Danke nman, werde mir den Link mal genauer zur Brust nehmen.
Das es darüber sehr heftige Streitereien gibt habe ich gemerkt und möchte beim besten Willen auch nicht einen anzetteln.
Den einzigen Vorteil/Nachteil den ich beim Socket-Select sehe ist, dass es nur eine feste Größe gibt und der rest "warten" muss und bei einem Thread das System regelrecht fritiert werden kann.
Aber sonst seh ich da keinen Unterschied. Was empfiehlst du denn für etwas "größeres" und warum?
-
Mach es doch am besten gleich vernünftig und nimm die beste Möglichkeit für deine Plattform.
Linux: epoll() (oder libevent, libev) und Non-blocking Sockets + Thread-Pool für Sachen die blockieren können
Windows: Overlapped I/O mit I/O Completion Port
-
wenns ein lernprojekt ist, dann mach beides