Can't start new thread

06/03/2009 - 11:17 von Florian Lindner | Report spam
Hallo,
ich habe einen Multi Threaded TCP Server, der auf
SocketServer.ThreadingMixIn und SocketServer.TCPServer aufsetzt. Er
làuft unter Python 2.4.4. Für jede einkommende Verbindung wird ein
Thread gestartet, selber - von Hand - starte ich gar keine neuen
Threads.
Letztens hatte ich im Log folgenden Fehler:

Traceback (most recent call last):
File "SocketServer.py", line 222, in handle_request
self.process_request(request, client_address)
File "SocketServer.py", line 476, in process_request
t.start()
File "threading.py", line 416, in start
_start_new_thread(self.__bootstrap, ())
error: can't start new thread

Wodurch könnte der entstehen? Fehlende Ressourcen sind es nicht, da
war noch genügend frei. Wie könnte man sowas am besten debuggen?

Grüße,

Florian
 

Lesen sie die antworten

#1 Thomas Rachel
06/03/2009 - 14:01 | Warnen spam
Florian Lindner schrieb:

Für jede einkommende Verbindung wird ein
Thread gestartet, selber - von Hand - starte ich gar keine neuen
Threads.



Und wie viele sind das parallel?


Letztens hatte ich im Log folgenden Fehler:

Traceback (most recent call last):
File "SocketServer.py", line 222, in handle_request
self.process_request(request, client_address)
File "SocketServer.py", line 476, in process_request
t.start()
File "threading.py", line 416, in start
_start_new_thread(self.__bootstrap, ())
error: can't start new thread

Wodurch könnte der entstehen?



Meine erste Vermutung wàre, daß Du eben doch zu viele eingehende
Verbindungen und somit zu viele Threads hast. Ähnliche Effekte hatte ich
letztens auch.

Probier mal


import threading
import time
tt=[threading.Thread(target=time.sleep, args=(.1,)) for i in range(300)]
for i in tt: i.start()
|...
|Traceback (most recent call last):
| File "<stdin>", line 1, in <module>
| File "/usr/lib/python2.5/threading.py", line 440, in start
| _start_new_thread(self.__bootstrap, ())
|thread.error: can't start new thread
len(threading.enumerate())
|205

Also scheint es da recht knappe Limits zu geben. Vielleicht solltest Du
(bspw. mit einem threading.Semaphore) die Anzahl der gleichzeitigen
Threads limitieren...

HTH,


Thomas

Ähnliche fragen