[Python] error: can't start new thread

Discussão em 'Python' iniciado por Stack, Maio 6, 2025.

  1. Stack

    Stack Membro Participativo

    I have a site that runs with follow configuration:

    Django + mod-wsgi + apache

    In one of user's request, I send another HTTP request to another service, and solve this by httplib library of python.

    But sometimes this service don't get answer too long, and timeout for httplib doesn't work. So I creating thread, in this thread I send request to service, and join it after 20 sec (20 sec - is a timeout of request). This is how it works:

    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


    something like this...

    And use it by this function:

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


    And all works fine, but sometime I start catching this exception:

    error: can't start new thread


    at the line of starting new thread:

    getting.start()


    and the next and the final line of traceback is

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


    And the answer is: What's happen?

    Thank's for all, and sorry for my pure English. :)

    Continue reading...

Compartilhe esta Página