Skip to content

Commit aecf6ac

Browse files
bdracoeendebakpt
andauthored
gh-106751: selectors: optimize EpollSelector.select() (#106754)
Co-authored-by: Pieter Eendebak <[email protected]>
1 parent 4cb0b9c commit aecf6ac

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

Lib/selectors.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,9 @@ class PollSelector(_PollLikeSelector):
430430

431431
if hasattr(select, 'epoll'):
432432

433+
_NOT_EPOLLIN = ~select.EPOLLIN
434+
_NOT_EPOLLOUT = ~select.EPOLLOUT
435+
433436
class EpollSelector(_PollLikeSelector):
434437
"""Epoll-based selector."""
435438
_selector_cls = select.epoll
@@ -452,22 +455,20 @@ def select(self, timeout=None):
452455
# epoll_wait() expects `maxevents` to be greater than zero;
453456
# we want to make sure that `select()` can be called when no
454457
# FD is registered.
455-
max_ev = max(len(self._fd_to_key), 1)
458+
max_ev = len(self._fd_to_key) or 1
456459

457460
ready = []
458461
try:
459462
fd_event_list = self._selector.poll(timeout, max_ev)
460463
except InterruptedError:
461464
return ready
462-
for fd, event in fd_event_list:
463-
events = 0
464-
if event & ~select.EPOLLIN:
465-
events |= EVENT_WRITE
466-
if event & ~select.EPOLLOUT:
467-
events |= EVENT_READ
468465

469-
key = self._fd_to_key.get(fd)
466+
fd_to_key = self._fd_to_key
467+
for fd, event in fd_event_list:
468+
key = fd_to_key.get(fd)
470469
if key:
470+
events = ((event & _NOT_EPOLLIN and EVENT_WRITE)
471+
| (event & _NOT_EPOLLOUT and EVENT_READ))
471472
ready.append((key, events & key.events))
472473
return ready
473474

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:mod:`selectors`: Optimize ``EpollSelector.select()`` code by moving some code outside of the loop.

0 commit comments

Comments
 (0)