Seite 1 von 1
Multi-Threaded Server vs. Single-Threaded-Server Modell
Verfasst: 8. Mai 2007 11:50
von nando
Hi Leute,
was meint ihr denn, wann wuerdet ihr euch fuer ein
multi-threaded-server modell entscheiden und wann fuer
single-threaded ?
gibt es eine moeglichkeit mit QT zu garantieren dass eine client verbindung nicht haengt und somit der ganze server steht ?
wie sieht es mit QSocketNotifier aus ?
interessant waere auch der gesichtspunkt der skalierung...
wir sind hier gerade rege am diskutieren
gruss,
nando
Verfasst: 8. Mai 2007 12:00
von Christian81
Die kompletten TCP/IP Verbindungen in Qt sind & können ohne Probleme non-blocking (also mit Threads bzw. mit Notifiern) implementiert werden. Also sehe ich da keine Probleme
Verfasst: 8. Mai 2007 12:31
von upsala
Single-Threaded ist auf jeden Fall mal auf einen Prozessor begrenzt. So viel zum Thema skalierung. Wie wärs mit einer Mischung aus beiden? Ich glaub ich hab schon was gesehen, daß man mit Qt abfragen kann wieviele Threads gleichzeit Sinn machen. Das wäre schon mal ein Ansatz für eine max. Anzahl an Threads...
Verfasst: 8. Mai 2007 15:24
von nando
wie ist das denn standardmaessig.... QTcpSocket scheint ja non-blocking zu sein, oder wie funktioniert das sonst QT intern?
Kann mir nicht vorstellen, dass jedes Socket Objekt intern ein select macht....
die frage is nur, was passiert, wenn ich z.b beim senden an einen client das kabel ziehe.... haengt dann der ganze server? oder ist das write non blocking und die daten werden vom kernel gepuffert...?
wie kann ich mich bei einer single-threaded loesung gegen haengen des ganzen servers schuetzen ? (also durch externe einfluesse) ...
hab das ganze mal ohne threads gemacht und bis jetzt funktioniert es... werde aber mal paar nette tests durchfuehren....
Verfasst: 8. Mai 2007 15:30
von Christian81
Ich rede jetzt einfach mal von Windows - da Qt plattformunabhängig ist, ist es unter Linux wohl so ähnlich.
Die Socket-Funktionen sind alle non-blocking. D.h. ich sende die Daten, Windows puffert sie mehr oder weniger zwischen und Du kannst sofort weiterarbeiten. Sind die Daten komplett versandt gibt es ein Windows-Event und Du bekommst das Qt-Signal QIODevice::bytesWritten().
Falls ein Senden nicht möglich ist wird dies auch über Events und/oder Signals angezeigt. Also alles komplett non-blocking.
Damit hätte sich wohl auch der Rest deiner Fragen beantwortet, denke ich.