error: can ' T start new thread
Ich habe eine Website, die läuft mit Folgen-Konfiguration:
Django + mod-wsgi + apache
In einer Benutzer-Anfrage, schicke ich ein anderes HTTP-Anforderung an einen anderen Dienst, und lösen dieses durch httplib Bibliothek von python.
Aber manchmal ist dieser service nicht bekommen, die Antwort zu lange, und das Zeitlimit für httplib nicht funktioniert. Also ich thread erstellen, in diesem thread, die ich senden Anfrage an service, und nehmen Sie es nach 20 sec (20 Sek. - ist eine Zeitüberschreitung der Anforderung). Dies ist, wie es funktioniert:
class HttpGetTimeOut(threading.Thread):
def __init__(self,**kwargs):
self.config = kwargs
self.resp_data = None
self.exception = None
super(HttpGetTimeOut,self).__init__()
def run(self):
h = httplib.HTTPSConnection(self.config['server'])
h.connect()
sended_data = self.config['sended_data']
h.putrequest("POST", self.config['path'])
h.putheader("Content-Length", str(len(sended_data)))
h.putheader("Content-Type", 'text/xml; charset="utf-8"')
if 'base_auth' in self.config:
base64string = base64.encodestring('%s:%s' % self.config['base_auth'])[:-1]
h.putheader("Authorization", "Basic %s" % base64string)
h.endheaders()
try:
h.send(sended_data)
self.resp_data = h.getresponse()
except httplib.HTTPException,e:
self.exception = e
except Exception,e:
self.exception = e
sowas...
Und verwenden Sie es, indem Sie diese Funktion:
getting = HttpGetTimeOut(**req_config)
getting.start()
getting.join(COOPERATION_TIMEOUT)
if getting.isAlive(): #maybe need some block
getting._Thread__stop()
raise ValueError('Timeout')
else:
if getting.resp_data:
r = getting.resp_data
else:
if getting.exception:
raise ValueError('REquest Exception')
else:
raise ValueError('Undefined exception')
Ist und alles Prima funktioniert, aber irgendwann habe ich beginnen, fangen diese Ausnahme:
error: can't start new thread
auf der Linie der Ausgangspunkt neuer thread:
getting.start()
und die nächste und die Letzte Zeile des traceback ist
File "/usr/lib/python2.5/threading.py", line 440, in start
_start_new_thread(self.__bootstrap, ())
Und die Antwort ist: Was ist geschehen?
Vielen Dank für alle, und sorry für mein Englisch pur. 🙂
InformationsquelleAutor der Frage Oduvan | 2009-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die "can' T start new thread" Fehler, die fast sicher aufgrund der Tatsache, dass Sie bereits zu viele threads laufen innerhalb Ihrer python-Prozess, und durch ein limit der Ressourcen irgendeiner Art der Anfrage einen neuen thread erstellen, wird abgelehnt.
Sollten Sie wahrscheinlich Blick auf die Anzahl der threads, die Sie erstellen; die maximale Anzahl können Sie erstellen, werden bestimmt durch Ihre Umwelt, aber es sollte in der Größenordnung von Hunderten zumindest.
Wäre es wahrscheinlich eine gute Idee, re-denken, Ihre Architektur hier; da dies asynchron ausgeführt wird jedenfalls, vielleicht könnten Sie einen pool von threads, die zum abrufen von Ressourcen von einer anderen Website statt immer ab bis ein thread für jeden request.
Eine weitere Verbesserung zu prüfen, ist Ihre Verwendung von Thread.mitmachen und Faden.stoppen; dies würde vermutlich besser erfüllt werden, indem Sie einen timeout-Wert an den Konstruktor von HTTPSConnection.
InformationsquelleAutor der Antwort Gabriel Reid
Beginnen Sie, mehr threads, als behandelt werden können, von Ihrem system. Es gibt ein limit für die Anzahl der threads, die aktiv sein können, für einen Prozess.
Ihre Anwendung beginnt threads schneller als die threads werden nicht beendet. Wenn Sie brauchen, um zu viele threads, die Sie brauchen, um es in ein mehr kontrolliert, würde ich vorschlagen, einen thread-pool.
InformationsquelleAutor der Antwort Tendayi Mawushe
Ich denke, der beste Weg in deinem Fall ist das festlegen der socket-timeout statt Laich-thread:
Sie können auch den globalen default-timeout-Zeit mit
socket.setdefaulttimeout()
Funktion.Update: Finden Sie die Antworten auf Gibt es eine Möglichkeit, zu töten einen Thread in Python? Frage (es gibt mehrere Recht informativ), zu verstehen, warum.
Thread.__stop()
nicht kündigen thread, sondern setzen Sie interne flag, so dass es als bereits beendet.InformationsquelleAutor der Antwort Denis Otkidach
Ich komplett neu schreiben code von httplib zu pycurl.
sowas.
Und ich testen es jetzt. Dank Euch allen für die Hilfe.
InformationsquelleAutor der Antwort Oduvan
Wenn Sie binden zu set timeout warum nutzen Sie nicht urllib2.
InformationsquelleAutor der Antwort Prashanth