У меня есть сайт, который работает с конфигурацией наблюдения:ошибка: не может начать новую нить
Django + моды-WSGI + апачом
В одном из запроса пользователя, я отправить еще один запрос HTTP на другую службу , и решить это с помощью библиотеки httplib python.
Но иногда эта служба не получает ответа слишком долго, а тайм-аут для httplib не работает. Поэтому я создаю поток, в этом потоке я отправляю запрос на обслуживание и присоединяюсь к нему через 20 секунд (20 секунд - это время ожидания запроса). Вот как это работает:
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
что-то вроде этого ...
И использовать его с помощью этой функции:
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')
И все работает отлично, но когда я начинаю ловить это исключение:
error: can't start new thread
на линии старта нового потока:
getting.start()
и следующий, и последняя строка TRACEBACK является
File "/usr/lib/python2.5/threading.py", line 440, in start
_start_new_thread(self.__bootstrap,())
И ответ: Что же случилось?
Спасибо за все, и извините за мой чистый английский. :)
Обратите внимание, что количество запущенных потоков может быть показано с помощью 'threading.active_count()'. – 101
Полезный sugestion, спасибо! –