Merge "Use monotonic lib. to avoid finding monotonic time function"
This commit is contained in:
@@ -31,6 +31,9 @@ stevedore>=1.5.0 # Apache-2.0
|
||||
# Backport for concurrent.futures which exists in 3.2+
|
||||
futures>=3.0
|
||||
|
||||
# Backport for time.monotonic which is in 3.3+
|
||||
monotonic>=0.1
|
||||
|
||||
# Used for structured input validation
|
||||
jsonschema!=2.5.0,<3.0.0,>=2.0.0
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import heapq
|
||||
import inspect
|
||||
|
||||
from debtcollector import removals
|
||||
import monotonic
|
||||
from oslo_utils import reflection
|
||||
import six
|
||||
|
||||
@@ -27,10 +28,6 @@ from taskflow.utils import threading_utils as tu
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
# Find a monotonic providing time (or fallback to using time.time()
|
||||
# which isn't *always* accurate but will suffice).
|
||||
_now = misc.find_monotonic(allow_time_time=True)
|
||||
|
||||
|
||||
def _check_attrs(obj):
|
||||
"""Checks that a periodic function/method has all the expected attributes.
|
||||
@@ -81,7 +78,7 @@ class _Schedule(object):
|
||||
|
||||
def push_next(self, cb, index, now=None):
|
||||
if now is None:
|
||||
now = _now()
|
||||
now = monotonic.monotonic()
|
||||
self.push(now + cb._periodic_spacing, index)
|
||||
|
||||
def __len__(self):
|
||||
@@ -103,7 +100,7 @@ def _build(callables):
|
||||
immediates.append(i)
|
||||
else:
|
||||
if now is None:
|
||||
now = _now()
|
||||
now = monotonic.monotonic()
|
||||
schedule.push_next(cb, i, now=now)
|
||||
return immediates, schedule
|
||||
|
||||
@@ -187,7 +184,7 @@ class PeriodicWorker(object):
|
||||
# minimum item from the heap, where the minimum should be
|
||||
# the callable that needs to run next and has the lowest
|
||||
# next desired run time).
|
||||
now = _now()
|
||||
now = monotonic.monotonic()
|
||||
next_run, index = self._schedule.pop()
|
||||
when_next = next_run - now
|
||||
if when_next <= 0:
|
||||
|
||||
@@ -24,7 +24,6 @@ import os
|
||||
import re
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import types
|
||||
|
||||
import enum
|
||||
@@ -48,17 +47,6 @@ NUMERIC_TYPES = six.integer_types + (float,)
|
||||
# see RFC 3986 section 3.1
|
||||
_SCHEME_REGEX = re.compile(r"^([A-Za-z][A-Za-z0-9+.-]*):")
|
||||
|
||||
_MONOTONIC_LOCATIONS = tuple([
|
||||
# The built-in/expected location in python3.3+
|
||||
'time.monotonic',
|
||||
# NOTE(harlowja): Try to use the pypi module that provides this
|
||||
# functionality for older versions of python less than 3.3 so that
|
||||
# they to can benefit from better timing...
|
||||
#
|
||||
# See: http://pypi.python.org/pypi/monotonic
|
||||
'monotonic.monotonic',
|
||||
])
|
||||
|
||||
|
||||
class StrEnum(str, enum.Enum):
|
||||
"""An enumeration that is also a string and can be compared to strings."""
|
||||
@@ -71,23 +59,6 @@ class StrEnum(str, enum.Enum):
|
||||
return super(StrEnum, cls).__new__(cls, *args, **kwargs)
|
||||
|
||||
|
||||
def find_monotonic(allow_time_time=False):
|
||||
"""Tries to find a monotonic time providing function (and returns it)."""
|
||||
for import_str in _MONOTONIC_LOCATIONS:
|
||||
mod_str, _sep, attr_str = import_str.rpartition('.')
|
||||
mod = importutils.try_import(mod_str)
|
||||
if mod is None:
|
||||
continue
|
||||
func = getattr(mod, attr_str, None)
|
||||
if func is not None:
|
||||
return func
|
||||
# Finally give up and use time.time (which isn't monotonic)...
|
||||
if allow_time_time:
|
||||
return time.time
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def match_type(obj, matchers):
|
||||
"""Matches a given object using the given matchers list/iterable.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user