Commit 635fca97 authored by Victor Stinner's avatar Victor Stinner

Issue #20311: selectors: Add a resolution attribute to BaseSelector.

parent 2041859f
...@@ -98,6 +98,10 @@ below: ...@@ -98,6 +98,10 @@ below:
:class:`BaseSelector` and its concrete implementations support the :class:`BaseSelector` and its concrete implementations support the
:term:`context manager` protocol. :term:`context manager` protocol.
.. attribute:: resolution
Resolution of the selector in seconds.
.. method:: register(fileobj, events, data=None) .. method:: register(fileobj, events, data=None)
Register a file object for selection, monitoring it for I/O events. Register a file object for selection, monitoring it for I/O events.
......
...@@ -5,7 +5,7 @@ This module allows high-level and efficient I/O multiplexing, built upon the ...@@ -5,7 +5,7 @@ This module allows high-level and efficient I/O multiplexing, built upon the
""" """
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod, abstractproperty
from collections import namedtuple, Mapping from collections import namedtuple, Mapping
import functools import functools
import select import select
...@@ -82,6 +82,11 @@ class BaseSelector(metaclass=ABCMeta): ...@@ -82,6 +82,11 @@ class BaseSelector(metaclass=ABCMeta):
performant implementation on the current platform. performant implementation on the current platform.
""" """
@abstractproperty
def resolution(self):
"""Resolution of the selector in seconds"""
return None
@abstractmethod @abstractmethod
def register(self, fileobj, events, data=None): def register(self, fileobj, events, data=None):
"""Register a file object. """Register a file object.
...@@ -283,6 +288,10 @@ class SelectSelector(_BaseSelectorImpl): ...@@ -283,6 +288,10 @@ class SelectSelector(_BaseSelectorImpl):
self._readers = set() self._readers = set()
self._writers = set() self._writers = set()
@property
def resolution(self):
return 1e-6
def register(self, fileobj, events, data=None): def register(self, fileobj, events, data=None):
key = super().register(fileobj, events, data) key = super().register(fileobj, events, data)
if events & EVENT_READ: if events & EVENT_READ:
...@@ -335,6 +344,10 @@ if hasattr(select, 'poll'): ...@@ -335,6 +344,10 @@ if hasattr(select, 'poll'):
super().__init__() super().__init__()
self._poll = select.poll() self._poll = select.poll()
@property
def resolution(self):
return 1e-3
def register(self, fileobj, events, data=None): def register(self, fileobj, events, data=None):
key = super().register(fileobj, events, data) key = super().register(fileobj, events, data)
poll_events = 0 poll_events = 0
...@@ -385,6 +398,10 @@ if hasattr(select, 'epoll'): ...@@ -385,6 +398,10 @@ if hasattr(select, 'epoll'):
super().__init__() super().__init__()
self._epoll = select.epoll() self._epoll = select.epoll()
@property
def resolution(self):
return 1e-3
def fileno(self): def fileno(self):
return self._epoll.fileno() return self._epoll.fileno()
...@@ -445,6 +462,10 @@ if hasattr(select, 'kqueue'): ...@@ -445,6 +462,10 @@ if hasattr(select, 'kqueue'):
super().__init__() super().__init__()
self._kqueue = select.kqueue() self._kqueue = select.kqueue()
@property
def resolution(self):
return 1e-9
def fileno(self): def fileno(self):
return self._kqueue.fileno() return self._kqueue.fileno()
......
...@@ -363,6 +363,11 @@ class BaseSelectorTestCase(unittest.TestCase): ...@@ -363,6 +363,11 @@ class BaseSelectorTestCase(unittest.TestCase):
self.assertFalse(s.select(2)) self.assertFalse(s.select(2))
self.assertLess(time() - t, 2.5) 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: class ScalableSelectorMixIn:
......
...@@ -36,6 +36,8 @@ Core and Builtins ...@@ -36,6 +36,8 @@ Core and Builtins
Library Library
------- -------
- Issue #20311: selectors: Add a resolution attribute to BaseSelector.
- Issue #20189: unittest.mock now no longer assumes that any object for - 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. which it could get an inspect.Signature is a callable written in Python.
Fix courtesy of Michael Foord. Fix courtesy of Michael Foord.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment