non-blocking-sockets: select unterbrechen
Verfasst: Sonntag 1. Juli 2007, 12:52
Hi
Ich verwende non-blocking threads und weiss nicht genau wie ich folgendes Lösen soll:
select wartet gerade, bis an den sockets etwas passiert, in diesem Moment möchte ich Daten über den Socket schicken.
- Wenn ich den Socket in die SchreibListe des selects schmeisse, ist die CPU-Last hoch, weil der socket immer schreibbar ist und select somit immer gleich weiter springt.
- Wenn ich aber den socket nur in die Liste tue wenn auch Daten anliegen, kann es passieren dass select wartet und den socket noch nicht in der Liste hat. Dieser wird erst beim nächsten Schleifendurchgang hinzugefügt. Somit könnte der Datenversand ziemlich verzögert sein.
Ich hatte nun schon die Lösung dass ich einfach einen socket habe der auf localhost horcht und wenn ich nun Daten habe kann ich select unterbrechen indem ich zu dem socket verbinde. Jedoch finde ich das irgendwie eine Bastellösung.
Ich könnte auch gar nicht auf schreibbar warten sondern direkt socket.send benutzen, jedoch weiss ich nicht ob das so richtig ist.
Wie könnte ich das sonst noch Lösen?
Ach ja für die, die es interessiert: Ich hab mir sozusagen ein asyncore gemacht, nur mit weniger Magic, irgendwie gefällt mir eine globale Map nicht.
Gruss
Ich verwende non-blocking threads und weiss nicht genau wie ich folgendes Lösen soll:
select wartet gerade, bis an den sockets etwas passiert, in diesem Moment möchte ich Daten über den Socket schicken.
- Wenn ich den Socket in die SchreibListe des selects schmeisse, ist die CPU-Last hoch, weil der socket immer schreibbar ist und select somit immer gleich weiter springt.
- Wenn ich aber den socket nur in die Liste tue wenn auch Daten anliegen, kann es passieren dass select wartet und den socket noch nicht in der Liste hat. Dieser wird erst beim nächsten Schleifendurchgang hinzugefügt. Somit könnte der Datenversand ziemlich verzögert sein.
Ich hatte nun schon die Lösung dass ich einfach einen socket habe der auf localhost horcht und wenn ich nun Daten habe kann ich select unterbrechen indem ich zu dem socket verbinde. Jedoch finde ich das irgendwie eine Bastellösung.
Ich könnte auch gar nicht auf schreibbar warten sondern direkt socket.send benutzen, jedoch weiss ich nicht ob das so richtig ist.
Wie könnte ich das sonst noch Lösen?
Ach ja für die, die es interessiert: Ich hab mir sozusagen ein asyncore gemacht, nur mit weniger Magic, irgendwie gefällt mir eine globale Map nicht.
Gruss