diff options
| author | Jenkins <jenkins@review.openstack.org> | 2015-03-17 05:01:02 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2015-03-17 05:01:02 +0000 |
| commit | 349405f70e7ec16c4a1fb90288c710ebc06ccd2f (patch) | |
| tree | 2cffb5b23040751e5274ece475a1f66b3e082254 /taskflow/utils/misc.py | |
| parent | 5d2fb53a34d4400a0599dd54f07482422d06f854 (diff) | |
| parent | a1f9321c3fda9af6ed4a240091f9c0c4917dc75d (diff) | |
| download | taskflow-349405f70e7ec16c4a1fb90288c710ebc06ccd2f.tar.gz | |
Merge "Ensure we register & deregister conductor listeners"
Diffstat (limited to 'taskflow/utils/misc.py')
| -rw-r--r-- | taskflow/utils/misc.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/taskflow/utils/misc.py b/taskflow/utils/misc.py index 8624d7c..ee5fb39 100644 --- a/taskflow/utils/misc.py +++ b/taskflow/utils/misc.py @@ -437,6 +437,38 @@ def get_duplicate_keys(iterable, key=None): return duplicates +class ListenerStack(object): + """Listeners that are deregistered on context manager exit. + + TODO(harlowja): replace this with ``contextlib.ExitStack`` or equivalent + in the future (that code is in python3.2+ and in a few backports that + provide nearly equivalent functionality). When/if + https://review.openstack.org/#/c/164222/ merges we should be able to + remove this since listeners are already context managers. + """ + + def __init__(self, log): + self._registered = [] + self._log = log + + def register(self, listeners): + for listener in listeners: + listener.register() + self._registered.append(listener) + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + while self._registered: + listener = self._registered.pop() + try: + listener.deregister() + except Exception: + self._log.warn("Failed deregistering listener '%s'", + listener, exc_info=True) + + class ExponentialBackoff(object): """An iterable object that will yield back an exponential delay sequence. |
