diff -r d7dc5ebc33ef Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/asyncio/base_events.py Tue Feb 04 00:24:18 2014 +0100 @@ -96,7 +96,6 @@ class BaseEventLoop(events.AbstractEvent self._default_executor = None self._internal_fds = 0 self._running = False - self._granularity = time.get_clock_info('monotonic').resolution def _make_socket_transport(self, sock, protocol, waiter=None, *, extra=None, server=None): @@ -638,7 +637,7 @@ class BaseEventLoop(events.AbstractEvent self._process_events(event_list) # Handle 'later' callbacks that are ready. - now = self.time() + self._granularity + now = self.time() while self._scheduled: handle = self._scheduled[0] if handle._when > now: diff -r d7dc5ebc33ef Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/asyncio/proactor_events.py Tue Feb 04 00:24:18 2014 +0100 @@ -362,7 +362,6 @@ class BaseProactorEventLoop(base_events. self._selector = proactor # convenient alias self._self_reading_future = None self._accept_futures = {} # socket file descriptor => Future - self._granularity = max(proactor.resolution, self._granularity) proactor.set_loop(self) self._make_self_pipe() diff -r d7dc5ebc33ef Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/asyncio/selector_events.py Tue Feb 04 00:24:18 2014 +0100 @@ -36,7 +36,6 @@ class BaseSelectorEventLoop(base_events. selector = selectors.DefaultSelector() logger.debug('Using selector: %s', selector.__class__.__name__) self._selector = selector - self._granularity = max(selector.resolution, self._granularity) self._make_self_pipe() def _make_socket_transport(self, sock, protocol, waiter=None, *, diff -r d7dc5ebc33ef Lib/selectors.py --- a/Lib/selectors.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/selectors.py Tue Feb 04 00:24:18 2014 +0100 @@ -83,11 +83,6 @@ 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. @@ -289,10 +284,6 @@ 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: @@ -345,10 +336,6 @@ 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 @@ -400,10 +387,6 @@ if hasattr(select, 'epoll'): super().__init__() self._epoll = select.epoll() - @property - def resolution(self): - return 1e-3 - def fileno(self): return self._epoll.fileno() @@ -468,10 +451,6 @@ if hasattr(select, 'kqueue'): super().__init__() self._kqueue = select.kqueue() - @property - def resolution(self): - return 1e-9 - def fileno(self): return self._kqueue.fileno() diff -r d7dc5ebc33ef Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/test/test_asyncio/test_base_events.py Tue Feb 04 00:24:18 2014 +0100 @@ -124,7 +124,8 @@ class BaseEventLoopTests(unittest.TestCa self.loop.run_forever() dt = self.loop.time() - t0 - self.assertGreaterEqual(dt, delay - self.loop._granularity, dt) + # 50 ms: maximum granularity of the event loop + self.assertGreaterEqual(dt, delay - 0.050, dt) # tolerate a difference of +800 ms because some Python buildbots # are really slow self.assertLessEqual(dt, 0.9, dt) diff -r d7dc5ebc33ef Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/test/test_asyncio/test_events.py Tue Feb 04 00:24:18 2014 +0100 @@ -1170,28 +1170,19 @@ class EventLoopTestsMixin: orig_run_once = self.loop._run_once self.loop._run_once_counter = 0 self.loop._run_once = _run_once - calls = [] @asyncio.coroutine def wait(): loop = self.loop - calls.append(loop._run_once_counter) - yield from asyncio.sleep(loop._granularity * 10, loop=loop) - calls.append(loop._run_once_counter) - yield from asyncio.sleep(loop._granularity / 10, loop=loop) - calls.append(loop._run_once_counter) + yield from asyncio.sleep(1e-2, loop=loop) + yield from asyncio.sleep(1e-4, loop=loop) self.loop.run_until_complete(wait()) - calls.append(self.loop._run_once_counter) - self.assertEqual(calls, [1, 3, 5, 6]) - - def test_granularity(self): - granularity = self.loop._granularity - self.assertGreater(granularity, 0.0) - # Worst expected granularity: 1 ms on Linux (limited by poll/epoll - # resolution), 15.6 ms on Windows (limited by time.monotonic - # resolution) - self.assertLess(granularity, 0.050) + # The ideal number of call is 6, but on some platforms, the selector + # may sleep at little bit less than timeout depending on the resolution + # of the clock used by the kernel. Tolerate 2 useless calls on these + # platforms. + self.assertLessEqual(self.loop._run_once_counter, 8) class SubprocessTestsMixin: diff -r d7dc5ebc33ef Lib/test/test_selectors.py --- a/Lib/test/test_selectors.py Mon Feb 03 23:59:52 2014 +0100 +++ b/Lib/test/test_selectors.py Tue Feb 04 00:24:18 2014 +0100 @@ -363,11 +363,6 @@ class BaseSelectorTestCase(unittest.Test 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: