首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

python3 的 EPOLLHUP 是怎么触发的?

  •  
  •   fghjghf · 31 天前 · 865 次点击
    这是一个创建于 31 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题。对端发送 close 关闭 socket,服务端的 EPOLLHUP 为啥不执行呢?
    前提:没有被 IN/OUT 覆盖,我是把它写在 if 判断的第一个位置。我打印了 event 的值,发现只有 1(in)、4(out)、5( in | out),并没有发现 EPOLLHUP 16 的迹象。
    dalao 们,有遇到过么,麻烦指点下
    8 回复  |  直到 2019-05-29 14:57:35 +08:00
        1
    lcdtyph   31 天前 via iPhone
    对端 close 的话 epoll 返回 EPOLLRDHUP
    EPOLLHUP 是对端 reset 了连接(假设 tcp )
        2
    moxiaowei   30 天前 via iPhone
    epoll 主动 modify 触发
        3
    fghjghf   30 天前
    @lcdtyph 这个我知道,按道理是这样的,不过我在 python3.7 里面,就是不触发,哭
        4
    fghjghf   30 天前
    @moxiaowei 请问具体是如何 modify 的呢,在什么情况下
        5
    mythmgn   28 天前
    没写过 3 的, 但是处理过 py2.7 的, 估计大同小异 可以参考下我的连接池实现代码:

    github.com/baidu/CUP/blob/master/cup/net/async/conn.py 重点是 poll 方法那一块
        6
    mythmgn   28 天前
    @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')
        7
    mythmgn   28 天前
    @fghjghf V2EX 不知道怎么显示代码, 直接 github 看吧
        8
    fghjghf   28 天前
    @mythmgn 好的,感谢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   892 人在线   最高记录 5043   ·   Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 20:05 · PVG 04:05 · LAX 13:05 · JFK 16:05
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1