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

This commit is contained in:
Victor Stinner 2014-01-25 14:56:48 +01:00
parent 2041859f27
commit 635fca9704
4 changed files with 33 additions and 1 deletions

View 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.

View file

@ -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 @@ 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 @@ def __init__(self):
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 @@ def __init__(self):
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 @@ def __init__(self):
super().__init__()
self._epoll = select.epoll()
@property
def resolution(self):
return 1e-3
def fileno(self):
return self._epoll.fileno()
@ -445,6 +462,10 @@ def __init__(self):
super().__init__()
self._kqueue = select.kqueue()
@property
def resolution(self):
return 1e-9
def fileno(self):
return self._kqueue.fileno()

View file

@ -363,6 +363,11 @@ def test_select_interrupt(self):
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:

View file

@ -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.