Skip to content
Snippets Groups Projects
Commit 367158a6 authored by Erik Johnston's avatar Erik Johnston
Browse files

Add wrap_as_background_process decorator.

This does the same thing as `run_as_background_process` but means we
don't need to create superfluous functions.
parent acb62a7c
No related branches found
No related tags found
No related merge requests found
......@@ -15,6 +15,8 @@
import logging
import threading
from asyncio import iscoroutine
from functools import wraps
import six
......@@ -197,7 +199,15 @@ def run_as_background_process(desc, func, *args, **kwargs):
_background_processes.setdefault(desc, set()).add(proc)
try:
yield func(*args, **kwargs)
# We ensureDeferred here to handle coroutines
result = func(*args, **kwargs)
# We need this check because ensureDeferred doesn't like when
# func doesn't return a Deferred or coroutine.
if iscoroutine(result):
result = defer.ensureDeferred(result)
return (yield result)
except Exception:
logger.exception("Background process '%s' threw an exception", desc)
finally:
......@@ -208,3 +218,20 @@ def run_as_background_process(desc, func, *args, **kwargs):
with PreserveLoggingContext():
return run()
def wrap_as_background_process(desc):
"""Decorator that wraps a function that gets called as a background
process.
Equivalent of calling the function with `run_as_background_process`
"""
def wrap_as_background_process_inner(func):
@wraps(func)
def wrap_as_background_process_inner_2(*args, **kwargs):
return run_as_background_process(desc, func, *args, **kwargs)
return wrap_as_background_process_inner_2
return wrap_as_background_process_inner
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment