Tôi có một trang web đó chạy với cấu hình sau:lỗi: không thể bắt đầu chủ đề mới
Django + mod-wsgi + apache
Trong một trong những yêu cầu của người dùng, tôi gửi một yêu cầu HTTP tới dịch vụ khác , và giải quyết điều này bằng thư viện httplib của python.
Nhưng đôi khi dịch vụ này không nhận được câu trả lời quá dài và thời gian chờ cho httplib không hoạt động. Vì vậy, tôi tạo chủ đề, trong chủ đề này tôi gửi yêu cầu đến dịch vụ và tham gia sau 20 giây (20 giây - là thời gian chờ yêu cầu). Đây là cách hoạt động:
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
một cái gì đó như thế này ...
Và sử dụng nó bằng chức năng này:
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')
Và tất cả hoạt động tốt, nhưng đôi khi tôi bắt đầu đánh bắt ngoại lệ này:
error: can't start new thread
tại dòng bắt đầu chủ đề mới:
getting.start()
và tiếp theo và dòng cuối cùng của traceback là
File "/usr/lib/python2.5/threading.py", line 440, in start
_start_new_thread(self.__bootstrap,())
Và câu trả lời là: Có gì xảy ra?
Cảm ơn tất cả và xin lỗi vì tiếng Anh thuần tuý của tôi. :)
Lưu ý rằng số lượng chuỗi chạy có thể được hiển thị bằng cách sử dụng 'threading.active_count()'. – 101
sugestion hữu ích, cảm ơn bạn! –