Python select.epoll().poll(),仅轮询eventmask 25
我创建了一个带有RequestHandler的服务器,该RequestHandler继承自Python select.epoll().poll(),仅轮询eventmask 25,python,epoll,Python,Epoll,我创建了一个带有RequestHandler的服务器,该RequestHandler继承自SocketServer.BaseRequestHandler,它使用epoll轮询socketEvents和Qevents 在最初几次将客户端连接到服务器时,一切都按预期工作,直到在某个点(似乎是随机的)epoll.poll()仅轮询事件[(37,25)],并且%CPU变为99%。!但是,客户端不会引发任何套接字错误 我的handle()方法如下(是RequestHandler的一部分) 我把打印语句放在
SocketServer.BaseRequestHandler
,它使用epoll轮询socketEvents和Qevents
在最初几次将客户端连接到服务器时,一切都按预期工作,直到在某个点(似乎是随机的)epoll.poll()
仅轮询事件[(37,25)]
,并且%CPU变为99%。!但是,客户端不会引发任何套接字错误
我的handle()
方法如下(是RequestHandler
的一部分)
我把打印语句放在那里只是为了看看我得到了什么,当一切正常时,我得到了
[(37,1)]
(socketEvent)和[(41,1)]
(QEvent)。发生了什么?如果有人感兴趣,那么我发现SocketServer.BaseRequestHandler
中的finish()
方法对处理关闭的连接没有任何作用。我所做的如下(这也会在客户端意外关闭连接时处理):
你在处理封闭连接吗?它们返回时可以阅读,直到它们被关闭和移除。(注意:select和poll也是如此,我不知道具体的epoll)我认为
BaseRequestHandler
中的finish()方法处理关闭的连接。我可能错了,所以我需要检查一下。谢谢@Max为我指明了正确的方向。BaseRequestHandler
中的finish()
方法没有任何作用。尽管当客户端意外关闭连接时,此问题仍然存在。
def handle(self):
""""
This method will process the incoming request while exit is not set
"""
try:
while not self.exit.is_set():
events = self.epoll.poll(1)
print events
if self.socketEvent in events:
self.handle_request()
if self.QEvent in events:
self.send_response()
finally:
self.finish()
return
def handle(self):
""""
This method will process the incoming request while exit is not set
"""
try:
while not self.exit.is_set():
events = self.epoll.poll(1)
print events
if self.socketEvent in events:
self.handle_request()
if self.QEvent in events:
self.send_response()
if (self.socketEvent[0],25) in events:
self.exit.set()
finally:
self.request.close()
return