def process_request(self, sock_params):
# The actual request handling takes place in __init__, so we need to
# set minimum_chunk_size before __init__ executes and we don't want to modify
# class variable
sock, address = sock_params
proto = new(self.protocol)
if self.minimum_chunk_size is not None:
proto.minimum_chunk_size = self.minimum_chunk_size
proto.capitalize_response_headers = self.capitalize_response_headers
try:
proto.__init__(sock, address, self)
except socket.timeout:
# Expected exceptions are not exceptional
sock.close()
# similar to logging "accepted" in server()
self.log.debug('(%s) timed out %r' % (self.pid, address))
BUG 就在上面, 绿色线程抛了一个假的 socket.timeout 错误 这里调用 sock close 无效, 先 shutdown 也没用....
没有有高人知道怎么解决这个 bug
1
lolizeppelin OP 今天闲着没事 终于把这个 bug 搞定了.....
eventlet 的 HttpProtocol(继承自 python 的 BaseHTTPRequestHandler)在接收数据的时候为了方便 通过 dup 把 socket 复制成了 file 对象 由于 python2.6 的 BaseRequestHandler 没有在 finally 中调用 finish 导致异常发生的时候没有关闭掉 dup 出来的 fd 所以调用了 socket.close 并不能关闭 socket 由于在 windows 环境一直是 2.7 的,导致一直没找到 bug..... 真是蛋痛... |