threading.py 文件源码

python
阅读 20 收藏 0 点赞 0 评论 0

项目:deb-kazoo 作者: openstack 项目源码 文件源码
def _epoll_select(self, rlist, wlist, xlist, timeout=None):
        """epoll-based drop-in replacement for select to overcome select
        limitation on a maximum filehandle value
        """
        if timeout is None:
            timeout = -1
        eventmasks = defaultdict(int)
        rfd2obj = defaultdict(list)
        wfd2obj = defaultdict(list)
        xfd2obj = defaultdict(list)
        read_evmask = select.EPOLLIN | select.EPOLLPRI  # Just in case

        def store_evmasks(obj_list, evmask, fd2obj):
            for obj in obj_list:
                fileno = _to_fileno(obj)
                eventmasks[fileno] |= evmask
                fd2obj[fileno].append(obj)

        store_evmasks(rlist, read_evmask, rfd2obj)
        store_evmasks(wlist, select.EPOLLOUT, wfd2obj)
        store_evmasks(xlist, select.EPOLLERR, xfd2obj)

        poller = select.epoll()

        for fileno in eventmasks:
            poller.register(fileno, eventmasks[fileno])

        try:
            events = poller.poll(timeout)
            revents = []
            wevents = []
            xevents = []
            for fileno, event in events:
                if event & read_evmask:
                    revents += rfd2obj.get(fileno, [])
                if event & select.EPOLLOUT:
                    wevents += wfd2obj.get(fileno, [])
                if event & select.EPOLLERR:
                    xevents += xfd2obj.get(fileno, [])
        finally:
            poller.close()

        return revents, wevents, xevents
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号