|
|
|
@ -92,7 +92,7 @@ def decode(b): |
|
|
|
|
try: |
|
|
|
|
return b.decode('utf8') |
|
|
|
|
except UnicodeDecodeError: |
|
|
|
|
logging.exception('Invalid encoding on {}'.format(b)) |
|
|
|
|
logging.exception('Invalid encoding on %s', b) |
|
|
|
|
return b.decode('latin1') |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -148,36 +148,23 @@ def fully_qualified_method(group, method): |
|
|
|
|
class CleanupThread(threading.Thread): |
|
|
|
|
"""A threading.Thread subclass supporting custom behavior on join(). |
|
|
|
|
|
|
|
|
|
On Python Interpreter exit, Python will attempt to join outstanding threads |
|
|
|
|
prior to garbage collection. We may need to do additional cleanup, and |
|
|
|
|
we accomplish this by overriding the join() method. |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
def __init__(self, |
|
|
|
|
behavior, |
|
|
|
|
group=None, |
|
|
|
|
target=None, |
|
|
|
|
name=None, |
|
|
|
|
args=(), |
|
|
|
|
kwargs={}): |
|
|
|
|
On Python Interpreter exit, Python will attempt to join outstanding threads |
|
|
|
|
prior to garbage collection. We may need to do additional cleanup, and |
|
|
|
|
we accomplish this by overriding the join() method. |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
def __init__(self, behavior, *args, **kwargs): |
|
|
|
|
"""Constructor. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
behavior (function): Function called on join() with a single |
|
|
|
|
argument, timeout, indicating the maximum duration of |
|
|
|
|
`behavior`, or None indicating `behavior` has no deadline. |
|
|
|
|
`behavior` must be idempotent. |
|
|
|
|
group (None): should be None. Reseved for future extensions |
|
|
|
|
when ThreadGroup is implemented. |
|
|
|
|
target (function): The function to invoke when this thread is |
|
|
|
|
run. Defaults to None. |
|
|
|
|
name (str): The name of this thread. Defaults to None. |
|
|
|
|
args (tuple[object]): A tuple of arguments to pass to `target`. |
|
|
|
|
kwargs (dict[str,object]): A dictionary of keyword arguments to |
|
|
|
|
pass to `target`. |
|
|
|
|
""" |
|
|
|
|
super(CleanupThread, self).__init__( |
|
|
|
|
group=group, target=target, name=name, args=args, kwargs=kwargs) |
|
|
|
|
Args: |
|
|
|
|
behavior (function): Function called on join() with a single |
|
|
|
|
argument, timeout, indicating the maximum duration of |
|
|
|
|
`behavior`, or None indicating `behavior` has no deadline. |
|
|
|
|
`behavior` must be idempotent. |
|
|
|
|
args: Positional arguments passed to threading.Thread constructor. |
|
|
|
|
kwargs: Keyword arguments passed to threading.Thread constructor. |
|
|
|
|
""" |
|
|
|
|
super(CleanupThread, self).__init__(*args, **kwargs) |
|
|
|
|
self._behavior = behavior |
|
|
|
|
|
|
|
|
|
def join(self, timeout=None): |
|
|
|
|