diff options
author | J. Nick Koston <nick@koston.org> | 2023-07-18 00:16:32 -1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-18 10:16:32 +0000 |
commit | aecf6aca515a203a823a87c711f15cbb82097c8b (patch) | |
tree | a75ec1d49c31d8e186305393215f3b9b84190536 /Lib/selectors.py | |
parent | 4cb0b9c0a9f6a4154238c98013d2679229b1f794 (diff) | |
download | cpython-aecf6aca515a203a823a87c711f15cbb82097c8b.tar.gz cpython-aecf6aca515a203a823a87c711f15cbb82097c8b.zip |
gh-106751: selectors: optimize EpollSelector.select() (#106754)
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Diffstat (limited to 'Lib/selectors.py')
-rw-r--r-- | Lib/selectors.py | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/Lib/selectors.py b/Lib/selectors.py index 6d82935445d..a42d1563406 100644 --- a/Lib/selectors.py +++ b/Lib/selectors.py @@ -430,6 +430,9 @@ if hasattr(select, 'poll'): if hasattr(select, 'epoll'): + _NOT_EPOLLIN = ~select.EPOLLIN + _NOT_EPOLLOUT = ~select.EPOLLOUT + class EpollSelector(_PollLikeSelector): """Epoll-based selector.""" _selector_cls = select.epoll @@ -452,22 +455,20 @@ if hasattr(select, 'epoll'): # epoll_wait() expects `maxevents` to be greater than zero; # we want to make sure that `select()` can be called when no # FD is registered. - max_ev = max(len(self._fd_to_key), 1) + max_ev = len(self._fd_to_key) or 1 ready = [] try: fd_event_list = self._selector.poll(timeout, max_ev) except InterruptedError: return ready - for fd, event in fd_event_list: - events = 0 - if event & ~select.EPOLLIN: - events |= EVENT_WRITE - if event & ~select.EPOLLOUT: - events |= EVENT_READ - key = self._fd_to_key.get(fd) + fd_to_key = self._fd_to_key + for fd, event in fd_event_list: + key = fd_to_key.get(fd) if key: + events = ((event & _NOT_EPOLLIN and EVENT_WRITE) + | (event & _NOT_EPOLLOUT and EVENT_READ)) ready.append((key, events & key.events)) return ready |