python resource

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

Guten Abend!
Ich habe ein Programm geschrieben, welches unter Umständen mehr Threads braucht, als mein Versuchsnetbook zur Verfügung stellt (~380).
Nach dem zu schließen, was ich im Inet gefunden habe, scheint der sogenannte StackSize das erstellen von weiteren Threads zu verhindern.
Deshalb will ich Gebrauch von dem resource Modul machen.
http://docs.python.org/library/resource.html
Meines Wissens nach reicht es, wenn man durch die Funktion resource.setrlimit(resource.RLIMIT_STACK, (-1,-1)) den StackSize auf das maximal Mögliche stellt.
Leider kann ich trotzdem nicht mehr threads öffnen :K
problembär

Was ist denn das für ein Programm? So viele Threads, kann man das nicht irgendwie anders machen?
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

mir fällt nichts ein.
Es ist übrigens ein Chatserver, der für jeden Clienten einen neuen Thread startet.
Eine andere Lösung als über Threads würde mir da nicht einfallen...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bob13 hat geschrieben:mir fällt nichts ein.
Es ist übrigens ein Chatserver, der für jeden Clienten einen neuen Thread startet.
Eine andere Lösung als über Threads würde mir da nicht einfallen...
Muss denn wirklich für jeden Client ein permanent laufender Thread gestartet sein? Ich stelle mir grad mal vor, das würden Webserver machen, die pro Minute Millionen Zugriffe haben... :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

Naja, bei webservern wird ja die verbindung nach "kurzer" zeit wieder beendet.
Bei einem chat server muss ja logischerweise die verbindung bestehen bleiben. Eine andere Lösung anstatt der mit Threads fällt mir btw auch nicht ein...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bob13 hat geschrieben:Naja, bei webservern wird ja die verbindung nach "kurzer" zeit wieder beendet.
Ja klar.
Bob13 hat geschrieben: Bei einem chat server muss ja logischerweise die verbindung bestehen bleiben. Eine andere Lösung anstatt der mit Threads fällt mir btw auch nicht ein...
Aber muss denn zwangsweise ein Thread nur einen Client abarbeiten?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

Wie soll ich das problem denn sonst lösen?
Bei einem Webserver könnte man in einer endlosschleife einfach auf connects warten und dann header+seite zurück senden. Performanter wären vllt. 4 fixe Threads oder Prozesse, die die mehrere Anfragen gleichzeitig bearbeiten. Wenn die Daten gesendet wurden, wird die Verbindung geschlossen und der Thread wartet auf einen neuen Clienten.

Bei meinem Chatserver muss logischerweise(?) immer ein socket.recv pro Client auf Nachrichten warten. wenn aber von dem Clienten, von dem gerade empfangen wird, keine Nachricht kommt, wird das ganze Programm gestoppt. Deshalb bieten sich hier Threads an, oder etwa nicht?
BlackJack

@Bob13: Schau Dir mal das `select`-Modul aus der Standardbibliothek an. Du kannst auch mit einem Thread auf mehreren Sockets gleichzeitig ”lauschen”.
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

Vielen Dank!
Das sollte mein Problem lösen.
Durch google bin ich nebenbei auf folgende Website gestoßen, die das ganze relativ anschaulich erklärt.
http://www.nightmare.com/medusa/async_sockets.html
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Eigentlich immer zu empfehlen sind auch Doug Hellmans "Module of the Week"-Seiten: Link
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Der traditionelle Vertreter in diesem Feld ist twisted, und neuerdings haben sich tornado & gevent einen Namen gemacht.
Bob13
User
Beiträge: 29
Registriert: Samstag 23. Mai 2009, 18:13

Und jetzt das... :x
--- <exception caught here> ---
File "C:\python27\lib\site-packages\twisted\internet\selectreactor.py", line 1
04, in doSelect
[], timeout)
File "C:\python27\lib\site-packages\twisted\internet\selectreactor.py", line 4
0, in win32select
r, w, e = select.select(r, w, w, timeout)
exceptions.ValueError: too many file descriptors in select()
Unhandled Error
Traceback (most recent call last):
File "server5.py", line 68, in <module>
reactor.run()
File "C:\python27\lib\site-packages\twisted\internet\base.py", line 1162, in r
un
self.mainLoop()
File "C:\python27\lib\site-packages\twisted\internet\base.py", line 1174, in m
ainLoop
self.doIteration(t)
--- <exception caught here> ---
Nach dem sich etwa 510 clienten mit dem server verbunden haben, scheint select probleme zu bekommen.
Übrigens habe ich, wie man ja der Fehlermeldung entnehmen kann, das ganze mit Twisted versucht zu lösen.

Hat irgendjemand eine Idee, das ganze zu lösen?
Zufrieden wäre ich mit ~1000 clienten ;)

Edit: Das ganze wurde jetzt auf einem windows pc getestet ;)
Edit2: Hier scheint die Lösung aufgeführt: http://www.mail-archive.com/twisted-pyt ... 00514.html
Antworten