changeset: 88695:3b8a2281d323 user: Victor Stinner date: Sat Jan 25 14:56:48 2014 +0100 files: Doc/library/selectors.rst Lib/selectors.py Lib/test/test_selectors.py Misc/NEWS description: Issue #20311: selectors: Add a resolution attribute to BaseSelector. diff -r 90354a4c9dde -r 3b8a2281d323 Doc/library/selectors.rst --- a/Doc/library/selectors.rst Sat Jan 25 14:43:45 2014 +0100 +++ b/Doc/library/selectors.rst Sat Jan 25 14:56:48 2014 +0100 @@ -98,6 +98,10 @@ :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. diff -r 90354a4c9dde -r 3b8a2281d323 Lib/selectors.py --- a/Lib/selectors.py Sat Jan 25 14:43:45 2014 +0100 +++ b/Lib/selectors.py Sat Jan 25 14:56:48 2014 +0100 @@ -5,7 +5,7 @@ """ -from abc import ABCMeta, abstractmethod +from abc import ABCMeta, abstractmethod, abstractproperty from collections import namedtuple, Mapping import functools import select @@ -82,6 +82,11 @@ 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 @@ 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 @@ 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 @@ super().__init__() self._epoll = select.epoll() + @property + def resolution(self): + return 1e-3 + def fileno(self): return self._epoll.fileno() @@ -445,6 +462,10 @@ super().__init__() self._kqueue = select.kqueue() + @property + def resolution(self): + return 1e-9 + def fileno(self): return self._kqueue.fileno() diff -r 90354a4c9dde -r 3b8a2281d323 Lib/test/test_selectors.py --- a/Lib/test/test_selectors.py Sat Jan 25 14:43:45 2014 +0100 +++ b/Lib/test/test_selectors.py Sat Jan 25 14:56:48 2014 +0100 @@ -363,6 +363,11 @@ 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: diff -r 90354a4c9dde -r 3b8a2281d323 Misc/NEWS --- a/Misc/NEWS Sat Jan 25 14:43:45 2014 +0100 +++ b/Misc/NEWS Sat Jan 25 14:56:48 2014 +0100 @@ -36,6 +36,8 @@ 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.