mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #20311: asyncio: Add a granularity attribute to BaseEventLoop: maximum
between the resolution of the BaseEventLoop.time() method and the resolution of the selector. The granuarility is used in the scheduler to round time and deadline.
This commit is contained in:
parent
635fca9704
commit
f67255ab94
6 changed files with 44 additions and 1 deletions
|
@ -18,6 +18,7 @@ import collections
|
|||
import concurrent.futures
|
||||
import heapq
|
||||
import logging
|
||||
import math
|
||||
import socket
|
||||
import subprocess
|
||||
import time
|
||||
|
@ -96,6 +97,7 @@ class BaseEventLoop(events.AbstractEventLoop):
|
|||
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):
|
||||
|
@ -603,6 +605,8 @@ class BaseEventLoop(events.AbstractEventLoop):
|
|||
elif self._scheduled:
|
||||
# Compute the desired timeout.
|
||||
when = self._scheduled[0]._when
|
||||
# round deadline aways from zero
|
||||
when = math.ceil(when / self.granularity) * self.granularity
|
||||
deadline = max(0, when - self.time())
|
||||
if timeout is None:
|
||||
timeout = deadline
|
||||
|
@ -629,6 +633,8 @@ class BaseEventLoop(events.AbstractEventLoop):
|
|||
|
||||
# Handle 'later' callbacks that are ready.
|
||||
now = self.time()
|
||||
# round current time aways from zero
|
||||
now = math.ceil(now / self.granularity) * self.granularity
|
||||
while self._scheduled:
|
||||
handle = self._scheduled[0]
|
||||
if handle._when > now:
|
||||
|
|
|
@ -34,6 +34,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
|
|||
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, *,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue