python3 的 EPOLLHUP 是怎么触发的?

2019-05-27 01:26:54 +08:00
 fghjghf
如题。对端发送 close 关闭 socket,服务端的 EPOLLHUP 为啥不执行呢?
前提:没有被 IN/OUT 覆盖,我是把它写在 if 判断的第一个位置。我打印了 event 的值,发现只有 1(in)、4(out)、5( in | out),并没有发现 EPOLLHUP 16 的迹象。
dalao 们,有遇到过么,麻烦指点下
2715 次点击
所在节点    Python
8 条回复
lcdtyph
2019-05-27 02:01:00 +08:00
对端 close 的话 epoll 返回 EPOLLRDHUP
EPOLLHUP 是对端 reset 了连接(假设 tcp )
moxiaowei
2019-05-27 07:58:09 +08:00
epoll 主动 modify 触发
fghjghf
2019-05-27 09:54:02 +08:00
@lcdtyph 这个我知道,按道理是这样的,不过我在 python3.7 里面,就是不触发,哭
fghjghf
2019-05-27 14:34:32 +08:00
@moxiaowei 请问具体是如何 modify 的呢,在什么情况下
mythmgn
2019-05-29 13:50:59 +08:00
没写过 3 的, 但是处理过 py2.7 的, 估计大同小异 可以参考下我的连接池实现代码:

github.com/baidu/CUP/blob/master/cup/net/async/conn.py 重点是 poll 方法那一块
mythmgn
2019-05-29 13:51:43 +08:00
@fghjghf

while not self._stopsign:
try:
events = self._epoll.poll(1)
except IOError as err:
if err.errno == errno.EINTR:
return
raise err
# log.debug('start to poll')
for fileno, event in events:
# if it comes from the listen port, new conn
if fileno == self._bind_sock.fileno():
newsock, addr = self._bind_sock.accept()
self._handle_new_conn(newsock, addr)
elif event & select.EPOLLIN:
try:
self._handle_new_recv(self._fileno2context[fileno])
except KeyError:
log.info('socket already closed')
elif event & select.EPOLLOUT:
try:
self._handle_new_send(self._fileno2context[fileno])
except KeyError:
log.info('socket already closed')
elif (event & select.EPOLLHUP) or (event & select.EPOLLERR):
# FIXME: consider if we need to release net msg resources
if event & select.EPOLLHUP:
log.info('--EPOLLHUP--')
else:
log.info('--EPOLLERR--')
try:
self.cleanup_error_context(
self._fileno2context[fileno]
)
except KeyError:
log.info('socket already closed')
mythmgn
2019-05-29 13:52:19 +08:00
@fghjghf V2EX 不知道怎么显示代码, 直接 github 看吧
fghjghf
2019-05-29 14:57:35 +08:00
@mythmgn 好的,感谢

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

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

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

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

© 2021 V2EX