Skip to content

Commit

Permalink
gh-106751: Optimize _PolllikeSelector for many iteration case (gh-106884
Browse files Browse the repository at this point in the history
)
  • Loading branch information
eendebakpt committed Jul 20, 2023
1 parent 1e1f4e9 commit 832c37d
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 17 deletions.
26 changes: 9 additions & 17 deletions Lib/selectors.py
Expand Up @@ -339,11 +339,8 @@ def __init__(self):

def register(self, fileobj, events, data=None):
key = super().register(fileobj, events, data)
poller_events = 0
if events & EVENT_READ:
poller_events |= self._EVENT_READ
if events & EVENT_WRITE:
poller_events |= self._EVENT_WRITE
poller_events = ((events & EVENT_READ and self._EVENT_READ)
| (events & EVENT_WRITE and self._EVENT_WRITE) )
try:
self._selector.register(key.fd, poller_events)
except:
Expand All @@ -369,11 +366,8 @@ def modify(self, fileobj, events, data=None):

changed = False
if events != key.events:
selector_events = 0
if events & EVENT_READ:
selector_events |= self._EVENT_READ
if events & EVENT_WRITE:
selector_events |= self._EVENT_WRITE
selector_events = ((events & EVENT_READ and self._EVENT_READ)
| (events & EVENT_WRITE and self._EVENT_WRITE))
try:
self._selector.modify(key.fd, selector_events)
except:
Expand Down Expand Up @@ -404,15 +398,13 @@ def select(self, timeout=None):
fd_event_list = self._selector.poll(timeout)
except InterruptedError:
return ready
for fd, event in fd_event_list:
events = 0
if event & ~self._EVENT_READ:
events |= EVENT_WRITE
if event & ~self._EVENT_WRITE:
events |= EVENT_READ

key = self._fd_to_key.get(fd)
fd_to_key_get = self._fd_to_key.get
for fd, event in fd_event_list:
key = fd_to_key_get(fd)
if key:
events = ((event & ~self._EVENT_READ and EVENT_WRITE)
| (event & ~self._EVENT_WRITE and EVENT_READ))
ready.append((key, events & key.events))
return ready

Expand Down
@@ -0,0 +1 @@
Optimize :meth:`_PollLikeSelector.select` for many iteration case.

0 comments on commit 832c37d

Please sign in to comment.