mirror of
https://github.com/element-hq/synapse
synced 2024-08-19 23:10:20 +00:00
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.
This commit is contained in:
parent
acb62a7cc6
commit
367158a609
1 changed files with 28 additions and 1 deletions
|
@ -15,6 +15,8 @@
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
|
from asyncio import iscoroutine
|
||||||
|
from functools import wraps
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
|
@ -197,7 +199,15 @@ def run_as_background_process(desc, func, *args, **kwargs):
|
||||||
_background_processes.setdefault(desc, set()).add(proc)
|
_background_processes.setdefault(desc, set()).add(proc)
|
||||||
|
|
||||||
try:
|
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:
|
except Exception:
|
||||||
logger.exception("Background process '%s' threw an exception", desc)
|
logger.exception("Background process '%s' threw an exception", desc)
|
||||||
finally:
|
finally:
|
||||||
|
@ -208,3 +218,20 @@ def run_as_background_process(desc, func, *args, **kwargs):
|
||||||
|
|
||||||
with PreserveLoggingContext():
|
with PreserveLoggingContext():
|
||||||
return run()
|
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
|
||||||
|
|
Loading…
Reference in a new issue