Seite 1 von 1
python resource
Verfasst: Samstag 18. Juni 2011, 22:47
von Bob13
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
Re: python resource
Verfasst: Samstag 18. Juni 2011, 23:17
von problembär
Was ist denn das für ein Programm? So viele Threads, kann man das nicht irgendwie anders machen?
Re: python resource
Verfasst: Samstag 18. Juni 2011, 23:30
von Bob13
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...
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 08:42
von Hyperion
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...

Re: python resource
Verfasst: Sonntag 19. Juni 2011, 08:47
von Bob13
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...
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 09:10
von Hyperion
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?
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 09:21
von Bob13
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?
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 09:49
von BlackJack
@Bob13: Schau Dir mal das `select`-Modul aus der Standardbibliothek an. Du kannst auch mit einem Thread auf mehreren Sockets gleichzeitig ”lauschen”.
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 09:55
von Bob13
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
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 10:03
von Hyperion
Eigentlich immer zu empfehlen sind auch Doug Hellmans "Module of the Week"-Seiten:
Link
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 10:50
von deets
Der traditionelle Vertreter in diesem Feld ist twisted, und neuerdings haben sich tornado & gevent einen Namen gemacht.
Re: python resource
Verfasst: Sonntag 19. Juni 2011, 20:26
von Bob13
Und jetzt das...
--- <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