def run(self) -> None: # logger.warning('This is a development server. Do not use it in a production deployment.') try: for task_name in self.deploy_cluster: try: schedule.every(self.crontab['action']).minutes.do( self.push_task, task_name=task_name) schedule.every(self.crontab['refresh']).minutes.do( self.rc.refresh, key_name=REDIS_SECRET_KEY.format(task_name)) logger.info( f"start {task_name}/crontab:{self.crontab['action']} minutes" ) except schedule.IntervalError: logger.error('interval set error') self.crontab['action'] += 5 while True: schedule.run_pending() time.sleep(1) except Exception as err: logger.exception('Exception occurred ||{}'.format(err)) noticer.send_email(text_body='{}'.format(err), to='self') except KeyboardInterrupt as err: logger.stop('Forced stop ||{}'.format(err))
def startup() -> None: process_list = [] try: # 部署<单进程多线程>定时任务 if ENABLE_DEPLOY['global']: process_list.append( multiprocessing.Process(target=_SystemEngine.run_deploy, name='deploymentTimingTask')) # 部署flask if ENABLE_SERVER: process_list.append( multiprocessing.Process(target=_SystemEngine.run_server, name='deploymentFlaskAPI')) # 执行多进程任务 for process_ in process_list: logger.success(f'<SystemProcess> Startup -- {process_.name}') process_.start() # 添加阻塞 for process_ in process_list: process_.join() except TypeError or AttributeError as e: logger.exception(e) send_email(f"[程序异常终止]{str(e)}", to_='self') except KeyboardInterrupt: # FIXME 确保进程间不产生通信的情况下终止 logger.debug('<SystemProcess> Received keyboard interrupt signal') for process_ in process_list: process_.terminate() finally: logger.success('<SystemProcess> End the V2RayCloudSpider')
def run(self) -> None: try: if self.enable_deploy: self.deploy_process = multiprocessing.Process( target=self.run_deploy, name='定时采集') logger.info(f'starting {self.deploy_process.name}') self.deploy_process.start() if ENABLE_SERVER: self.server_process = multiprocessing.Process( target=self.run_server, name='程序接口') logger.info(f'starting {self.server_process.name}') self.server_process.start() self.deploy_process.join() self.server_process.join() except TypeError or AttributeError as e: logger.exception(e) send_email("[程序异常终止]{}".format(str(e)), to='self') except KeyboardInterrupt: logger.debug('received keyboard interrupt signal') self.server_process.terminate() self.deploy_process.terminate() finally: self.deploy_process.join() self.server_process.join() logger.info( f'{self.deploy_process.name} is {"alive" if self.deploy_process.is_alive() else "dead"}' ) logger.info( f'{self.server_process.name} is {"alive" if self.server_process.is_alive() else "dead"}' ) logger.success('<Gevent>任务结束')
def run(self) -> None: # logger.warning('This is a development server. Do not use it in a production deployment.') try: for task_name in self.deploy_cluster: try: schedule.every(self.crontab['action']).minutes.do(self.push_task, task_name=task_name) if ENABLE_DDT: schedule.every(self.crontab['refresh']).minutes.do(self.rc.refresh, key_name=REDIS_SECRET_KEY.format(task_name)) logger.success(f"START DDT -- {task_name}") else: logger.warning(f'Not Authorized -- DDT({task_name})') logger.success(f"START TASK -- {task_name}/crontab:{self.crontab['action']} minutes") except schedule.IntervalError: logger.error('interval set error') # self.crontab['action'] += 5 while True: schedule.run_pending() time.sleep(1) except Exception as err: logger.exception('Exception occurred ||{}'.format(err)) noticer.send_email(msg='{}'.format(err), to_='self') except KeyboardInterrupt as err: logger.stop('Forced stop ||{}'.format(err))