def run(*args: P.args, **kwargs: P.kwargs) -> Awaitable[R]: # Assertion required because mypy can't prove we won't change `f` # back to `None`. See # https://mypy.readthedocs.io/en/latest/common_issues.html#narrowing-and-inner-functions assert f is not None return maybe_awaitable(f(*args, **kwargs))
def looping_background_call( self, f: Callable, msec: float, *args: object, desc: Optional[str] = None, run_on_all_instances: bool = False, **kwargs: object, ) -> None: """Wraps a function as a background process and calls it repeatedly. NOTE: Will only run on the instance that is configured to run background processes (which is the main process by default), unless `run_on_all_workers` is set. Waits `msec` initially before calling `f` for the first time. Added in Synapse v1.39.0. Args: f: The function to call repeatedly. f can be either synchronous or asynchronous, and must follow Synapse's logcontext rules. More info about logcontexts is available at https://matrix-org.github.io/synapse/latest/log_contexts.html msec: How long to wait between calls in milliseconds. *args: Positional arguments to pass to function. desc: The background task's description. Default to the function's name. run_on_all_instances: Whether to run this on all instances, rather than just the instance configured to run background tasks. **kwargs: Key arguments to pass to function. """ if desc is None: desc = f.__name__ if self._hs.config.worker.run_background_tasks or run_on_all_instances: self._clock.looping_call( run_as_background_process, msec, desc, lambda: maybe_awaitable(f(*args, **kwargs)), ) else: logger.warning( "Not running looping call %s as the configuration forbids it", f, )
def run(*args, **kwargs): # mypy doesn't do well across function boundaries so we need to tell it # f is definitely not None. assert f is not None return maybe_awaitable(f(*args, **kwargs))