mirror of
https://github.com/linuxserver/docker-python.git
synced 2026-02-19 17:24:19 +08:00
57 lines
2.0 KiB
Diff
57 lines
2.0 KiB
Diff
From aecf6aca515a203a823a87c711f15cbb82097c8b Mon Sep 17 00:00:00 2001
|
|
From: "J. Nick Koston" <nick@koston.org>
|
|
Date: Tue, 18 Jul 2023 00:16:32 -1000
|
|
Subject: [PATCH] gh-106751: selectors: optimize EpollSelector.select()
|
|
(#106754)
|
|
|
|
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
|
|
---
|
|
Lib/selectors.py | 17 +++++++++--------
|
|
1 file changed, 9 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/Lib/selectors.py b/Lib/selectors.py
|
|
index 6d82935445..a42d156340 100644
|
|
--- a/Lib/selectors.py
|
|
+++ b/Lib/selectors.py
|
|
@@ -430,6 +430,9 @@ class PollSelector(_PollLikeSelector):
|
|
|
|
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 @@ def select(self, timeout=None):
|
|
# 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
|
|
|
|
--
|
|
2.39.2 (Apple Git-143)
|