mirror of https://github.com/python/cpython.git
gh-106751: selectors: optimize EpollSelector.select() (#106754)
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
This commit is contained in:
parent
4cb0b9c0a9
commit
aecf6aca51
|
@ -430,6 +430,9 @@ class PollSelector(_PollLikeSelector):
|
||||||
|
|
||||||
if hasattr(select, 'epoll'):
|
if hasattr(select, 'epoll'):
|
||||||
|
|
||||||
|
_NOT_EPOLLIN = ~select.EPOLLIN
|
||||||
|
_NOT_EPOLLOUT = ~select.EPOLLOUT
|
||||||
|
|
||||||
class EpollSelector(_PollLikeSelector):
|
class EpollSelector(_PollLikeSelector):
|
||||||
"""Epoll-based selector."""
|
"""Epoll-based selector."""
|
||||||
_selector_cls = select.epoll
|
_selector_cls = select.epoll
|
||||||
|
@ -452,22 +455,20 @@ def select(self, timeout=None):
|
||||||
# epoll_wait() expects `maxevents` to be greater than zero;
|
# epoll_wait() expects `maxevents` to be greater than zero;
|
||||||
# we want to make sure that `select()` can be called when no
|
# we want to make sure that `select()` can be called when no
|
||||||
# FD is registered.
|
# FD is registered.
|
||||||
max_ev = max(len(self._fd_to_key), 1)
|
max_ev = len(self._fd_to_key) or 1
|
||||||
|
|
||||||
ready = []
|
ready = []
|
||||||
try:
|
try:
|
||||||
fd_event_list = self._selector.poll(timeout, max_ev)
|
fd_event_list = self._selector.poll(timeout, max_ev)
|
||||||
except InterruptedError:
|
except InterruptedError:
|
||||||
return ready
|
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:
|
if key:
|
||||||
|
events = ((event & _NOT_EPOLLIN and EVENT_WRITE)
|
||||||
|
| (event & _NOT_EPOLLOUT and EVENT_READ))
|
||||||
ready.append((key, events & key.events))
|
ready.append((key, events & key.events))
|
||||||
return ready
|
return ready
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
:mod:`selectors`: Optimize ``EpollSelector.select()`` code by moving some code outside of the loop.
|
Loading…
Reference in New Issue