]> granicus.if.org Git - python/commitdiff
Issue #20311: selectors: Add a resolution attribute to BaseSelector.
authorVictor Stinner <victor.stinner@gmail.com>
Sat, 25 Jan 2014 13:56:48 +0000 (14:56 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Sat, 25 Jan 2014 13:56:48 +0000 (14:56 +0100)
Doc/library/selectors.rst
Lib/selectors.py
Lib/test/test_selectors.py
Misc/NEWS

index 98377c890f024220b4e652608cd56e21de6b86ac..4c322bd75a2fba0b9504e129b8fe90d76694d493 100644 (file)
@@ -98,6 +98,10 @@ below:
    :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.
index cd8b29e4cc2c246a63e901f51cf566172efb1574..b1b530afcb43e4d23562e42abda6ca66cc27ffac 100644 (file)
@@ -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
 import functools
 import select
@@ -82,6 +82,11 @@ class BaseSelector(metaclass=ABCMeta):
     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.
@@ -283,6 +288,10 @@ class SelectSelector(_BaseSelectorImpl):
         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:
@@ -335,6 +344,10 @@ if hasattr(select, 'poll'):
             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
@@ -385,6 +398,10 @@ if hasattr(select, 'epoll'):
             super().__init__()
             self._epoll = select.epoll()
 
+        @property
+        def resolution(self):
+            return 1e-3
+
         def fileno(self):
             return self._epoll.fileno()
 
@@ -445,6 +462,10 @@ if hasattr(select, 'kqueue'):
             super().__init__()
             self._kqueue = select.kqueue()
 
+        @property
+        def resolution(self):
+            return 1e-9
+
         def fileno(self):
             return self._kqueue.fileno()
 
index 529290460f4dea1bbc1c90f5ce3299400cda7ae9..f7e84b7e99c2ff0f0379df7302a5843c86dd9656 100644 (file)
@@ -363,6 +363,11 @@ class BaseSelectorTestCase(unittest.TestCase):
         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:
 
index c298260c5bb82a0f93f42175b0867467c9bd1b99..2b1200e1aa0134909d6f89466fdb650f35149981 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -36,6 +36,8 @@ Core and Builtins
 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.