ich habe folgendes Problem und brauche mal einen Tipp, in welcher Richtung ich weitersuchen kann.
Ich habe einen Server mit einem Serversocket. Bei jedem Accept, d.h. bei einer Neuverbindung durch einen Client, möchte ich den Clientsocket auf eingehende Daten überwachen lassen, aber im Hintergrund.
Das ist normalerweise einfach: Einfach einen Thread starten, der im blocking mode clientsocket.recv() abfragt. Aber das geht bei mir leider nicht, da ich sehr viele Clientverbindungen erwarten und soviele Threads kann ich nicht starten (getestet habe ich zuhause ein Maximum von knapp über 300 und auf dem Server von knapp über 10k).
Welche Möglichkeiten habe ich jetzt, eine Socketüberwachung zu realisieren? Es sollte ungefähr so aussehen:
Wenn ein Socket aus SocketArray Daten hat:
data = Socket.recv()...
gobalesDatenArray.append(data)
Jemand irgendwelche Ideen?
Ich habe schon Select.select versucht, aber da bekomme ich zwei Probleme:
a) Select.select wartet auf ein Event aus einer übergebenen Socketliste. Was soll ich machen, wenn sich ein neuer Socket verbindet, während ich im select warte?
b) Wenn Select.select einen Socket zurückgibt, der Daten hat, dann will ich diesen Socket an einen neuen (Worker)Thread übergeben (von denen es maximal 100 gibt) und dann wieder per Select warten. Aber da der Socket noch nicht ausgelesen sein wird, bevor Select wieder wartet, gibt mir Select SOFORT den selben Socket wieder zurück.

Alternativ habe ich mir gedacht, ich könnte eine Schleife machen, die dauernd alle Sockets der Liste durchgeht, und im nonBlocking mode einfach socekt.recv durchführt. Wenn es keine Daten gibt, dann weiter. Dann würde aber die Prozesslast enorm steigen, nur durch so ein "billiges" Dauerüberwachen.
Dann habe ich noch Asyncore gesehen. Aber da kann man nur Eventhandler für Socketobjekte hinterlegen. Das würde mir im Zweifelsfall auch 10k oder mehr Threads gleichzeitig starten.
Hoffentlich habt ihr eine Idee!