:class:`BaseSelector` and its concrete implementations support the
:term:`context manager` protocol.
+ .. attribute:: resolution
+
+ Resolution of the selector in seconds.
+
.. method:: register(fileobj, events, data=None)
Register a file object for selection, monitoring it for I/O events.
"""
-from abc import ABCMeta, abstractmethod
+from abc import ABCMeta, abstractmethod, abstractproperty
from collections import namedtuple, Mapping
import functools
import select
performant implementation on the current platform.
"""
+ @abstractproperty
+ def resolution(self):
+ """Resolution of the selector in seconds"""
+ return None
+
@abstractmethod
def register(self, fileobj, events, data=None):
"""Register a file object.
self._readers = set()
self._writers = set()
+ @property
+ def resolution(self):
+ return 1e-6
+
def register(self, fileobj, events, data=None):
key = super().register(fileobj, events, data)
if events & EVENT_READ:
super().__init__()
self._poll = select.poll()
+ @property
+ def resolution(self):
+ return 1e-3
+
def register(self, fileobj, events, data=None):
key = super().register(fileobj, events, data)
poll_events = 0
super().__init__()
self._epoll = select.epoll()
+ @property
+ def resolution(self):
+ return 1e-3
+
def fileno(self):
return self._epoll.fileno()
super().__init__()
self._kqueue = select.kqueue()
+ @property
+ def resolution(self):
+ return 1e-9
+
def fileno(self):
return self._kqueue.fileno()
self.assertFalse(s.select(2))
self.assertLess(time() - t, 2.5)
+ def test_resolution(self):
+ s = self.SELECTOR()
+ self.assertIsInstance(s.resolution, (int, float))
+ self.assertGreater(s.resolution, 0.0)
+
class ScalableSelectorMixIn:
Library
-------
+- Issue #20311: selectors: Add a resolution attribute to BaseSelector.
+
- Issue #20189: unittest.mock now no longer assumes that any object for
which it could get an inspect.Signature is a callable written in Python.
Fix courtesy of Michael Foord.