def run_forever(args, config): # ensure requiresments, raise SystemExit if failed os.chdir(os.path.join(os.path.dirname(__file__), '../..')) ensure_dirs() # In an ideal world, users are capable to do anything in rcfile, # including monkeypatch, so we should load rcfile as early as possible fuoexec_load_rcfile(config) # Extract config items from args and setup config object, # since then, no more `args` object, only `config`. setup_config(args, config) setup_logger(config) # create app instance with config # # nothing should happen except all objects are created app = create_app(config) # do fuoexec initialization before app inits fuoexec_init(app) # initialize app with config # # all objects can do initialization here. some objects may emit signal, # some objects may connect with others signals. init_app(app) app.initialized.emit(app) run_app(app)
async def start_app(args, config, sentinal=None): """ The param sentinal is currently only used for unittest. """ Signal.setup_aio_support() app = create_app(args, config) # Do fuoexec initialization before app initialization. fuoexec_init(app) # Initialize app with config. # # all objects can do initialization here. some objects may emit signal, # some objects may connect with others signals. app.initialize() app.initialized.emit(app) # Load last state. app.load_state() def sighanlder(signum, _): logger.info('Signal %d is received', signum) app.exit() # Handle signals. signal.signal(signal.SIGTERM, sighanlder) signal.signal(signal.SIGINT, sighanlder) if sentinal is None: sentinal: asyncio.Future = asyncio.Future() def shutdown(_): # Since about_to_shutdown signal may emit multiple times # (QApplication.aboutToQuit emits multiple times), # we should check if it is already done firstly. if not sentinal.done(): sentinal.set_result(0) app.about_to_shutdown.connect(shutdown, weak=False) # App can exit in several ways. # # GUI mode: # 1. QApplication.quit. QApplication.quit can be called under several circumstances # 1. User press CMD-Q on macOS. # 2. User clicks the tray icon exit button. # 2. SIGTERM is received. # # Daemon mode: # 1. Ctrl-C # 2. SIGTERM app.run() await sentinal Signal.teardown_aio_support()
def run_once(args, config): # ignore all warnings since it will pollute the output warnings.filterwarnings("ignore") fuoexec_load_rcfile(config) setup_config(args, config) app = create_app(config) fuoexec_init(app) init_app(app) app.initialized.emit(app) future = oncemain(app, args) if future is not None: run_app_once(app, future)