def start_reactor( appname: str, soft_file_limit: int, gc_thresholds: Optional[Tuple[int, int, int]], pid_file: Optional[str], daemonize: bool, print_pidfile: bool, logger: logging.Logger, run_command: Callable[[], None] = reactor.run, ) -> None: """Run the reactor in the main process Daemonizes if necessary, and then configures some resources, before starting the reactor Args: appname: application name which will be sent to syslog soft_file_limit: gc_thresholds: pid_file: name of pid file to write to if daemonize is True daemonize: true to run the reactor in a background process print_pidfile: whether to print the pid file, if daemonize is True logger: logger instance to pass to Daemonize run_command: callable that actually runs the reactor """ def run() -> None: logger.info("Running") setup_jemalloc_stats() change_resource_limit(soft_file_limit) if gc_thresholds: gc.set_threshold(*gc_thresholds) install_gc_manager() run_command() # make sure that we run the reactor with the sentinel log context, # otherwise other PreserveLoggingContext instances will get confused # and complain when they see the logcontext arbitrarily swapping # between the sentinel and `run` logcontexts. # # We also need to drop the logcontext before forking if we're daemonizing, # otherwise the cputime metrics get confused about the per-thread resource usage # appearing to go backwards. with PreserveLoggingContext(): if daemonize: assert pid_file is not None if print_pidfile: print(pid_file) daemonize_process(pid_file, logger) run()
def start_reactor( appname, soft_file_limit, gc_thresholds, pid_file, daemonize, print_pidfile, logger, run_command=reactor.run, ): """ Run the reactor in the main process Daemonizes if necessary, and then configures some resources, before starting the reactor Args: appname (str): application name which will be sent to syslog soft_file_limit (int): gc_thresholds: pid_file (str): name of pid file to write to if daemonize is True daemonize (bool): true to run the reactor in a background process print_pidfile (bool): whether to print the pid file, if daemonize is True logger (logging.Logger): logger instance to pass to Daemonize run_command (Callable[]): callable that actually runs the reactor """ install_dns_limiter(reactor) def run(): logger.info("Running") change_resource_limit(soft_file_limit) if gc_thresholds: gc.set_threshold(*gc_thresholds) run_command() # make sure that we run the reactor with the sentinel log context, # otherwise other PreserveLoggingContext instances will get confused # and complain when they see the logcontext arbitrarily swapping # between the sentinel and `run` logcontexts. # # We also need to drop the logcontext before forking if we're daemonizing, # otherwise the cputime metrics get confused about the per-thread resource usage # appearing to go backwards. with PreserveLoggingContext(): if daemonize: if print_pidfile: print(pid_file) daemonize_process(pid_file, logger) run()