eventlet 的 keepalive bug 咋解决 GOOGLE 上也搜捕到好办法

2018-03-21 14:43:25 +08:00
 lolizeppelin
    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

1478 次点击
所在节点    Python
1 条回复
lolizeppelin
2018-05-23 23:28:53 +08:00
今天闲着没事 终于把这个 bug 搞定了.....

eventlet 的 HttpProtocol(继承自 python 的 BaseHTTPRequestHandler)在接收数据的时候为了方便
通过 dup 把 socket 复制成了 file 对象
由于 python2.6 的 BaseRequestHandler 没有在 finally 中调用 finish
导致异常发生的时候没有关闭掉 dup 出来的 fd
所以调用了 socket.close 并不能关闭 socket

由于在 windows 环境一直是 2.7 的,导致一直没找到 bug.....
真是蛋痛...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/440069

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX