erreur: impossible de démarrer un nouveau fil

J'ai un site qui tourne avec un suivi de configuration:

Django + mod_wsgi + apache

Dans l'une de demande de l'utilisateur, j'ai envoyer une autre requête HTTP vers un autre service, et de le résoudre en httplib bibliothèque de python.

Mais parfois, ce service n'obtenez pas de réponse trop long, et le délai d'expiration pour httplib ne fonctionne pas. J'ai donc la création d'un thread, dans ce fil, j'ai envoyer une demande de service, et de le joindre au bout de 20 sec (20 sec - est un délai d'attente de la demande). Voilà comment cela fonctionne:

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

quelque chose comme ça...

Et l'utilisation de cette fonction:

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')

Et tous fonctionne bien, mais parfois j'ai commencer à attraper cette exception:

error: can't start new thread

à la ligne de départ de la nouvelle thread:

getting.start()

et la prochaine et dernière ligne de traceback est

File "/usr/lib/python2.5/threading.py", line 440, in start
    _start_new_thread(self.__bootstrap, ())

Et la réponse est: Ce qui est arrivé?

Merci pour tous, et désolé pour mon anglais pur. 🙂

source d'informationauteur Oduvan

Leave a Reply

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *