def step_admin_element(class_: str = None) -> None: """ 管理员权限--范式缓冲 @param class_: @return: """ from BusinessLogicLayer.cluster.__task__ import loads_task loads_task(class_=class_, one_step=True)
def push_task(self, task_name: str) -> bool: """ @param task_name: @return: """ # 输入参数的数据类型错误 if not isinstance(task_name, str): logger.error(f'The input type is wrong({task_name})') return False # 输入的参数不在模型的权限范围中 if task_name not in self.deploy_cluster: logger.error( f'Spelling error in input({task_name}),Please choose from {self.deploy_cluster}' ) return False try: # 判断缓冲队列是否已达单机采集极限 task_name = task_name.lower() self.rc_len[f'{task_name}'] = self.rc.__len__( REDIS_SECRET_KEY.format(f'{task_name}')) logger.info(f'[TEST] ||正在检查({task_name}) 任务队列...') # 若已达或超过单机采集极限,则休眠任务 if self.rc_len[f"{task_name}"] >= self.cap: logger.debug( f'[SLEEP] || 任务队列已满 ({task_name}) ({self.rc_len[f"{task_name}"]}/{self.cap})' ) return True finally: # 无论队列是否已满,执行一次ddt self.ddt(class_=task_name) try: # 执行采集任务,通过self.go决定是否启动协程加速 logger.info(f'[RUN] || ({task_name}) 采集任务启动') __task__.loads_task(task_name, self.go) # 判断任务是否完全失败,既单个类型链接的所有采集任务全部失败->Abnormal if self.rc.__len__(REDIS_SECRET_KEY.format( f'{task_name}')) < self.rc_len[f'{task_name}']: logger.error( f'[CRITICAL]Abnormal collection task({task_name})') else: return True except Exception as e: # 捕获未知错误 logger.error( f'[ERROR]{self.__class__.__name__}({task_name}) crawler engine panic {e}' ) finally: # 单个类型的链接采集结束 logger.success('[OVER] || 任务结束 {}({})'.format( self.__class__.__name__, task_name))
def run_check(self, class_: str) -> None: """ 启动任务:以非部署模式,传递参数 @param class_: --传入的应是 config 中 crawler seq中的参数,如`v2ray`/`ssr`/`trojan` --确保操作的原子性,不要一次性传入多个参数, --正确的做法是通过<协程引擎>的消息队列形式驱动多任务 --或使用for迭代work_seq顺序驱动多任务 @return: """ __task__.loads_task(class_, self.go, startup=False, loads_=True)
def run_check(self, at_once=True) -> None: """ 本地运行--检查队列残缺 # 所有类型任务的节点行为的同时发起 or 所有类型任务的节点行为按序执行,node任务之间互不影响 --v2rayChain --vNode_1 --vNode_2 --.... --ssrChain --sNode_1 --sNode_2 --... --.. -----> runtime v2rayChain IF USE vsu -> runtime allTask =====> runtime ... -----> runtime ssrChain ELSE -> runtime allTask -> Chain_1 -> Chain_2 -> ... -----> runtime node_1 IF USE go -> runtime allNode =====> runtime ... -----> runtime node_N ELSE -> runtime allNode-> the_node_1 -> the_node_2 -> ... @return: """ # 加载任务队列(广度优先) for task in self.check_seq: loads_task(task, startup=False, at_once=at_once) # 任务启动 并发执行 vsu(core=PuppetCore(), docker=Middleware.poseidon).run(self.speed_up) print('Easter eggs') # fixme 数据存储 节拍同步 if not at_once: FlexibleDistribute().start() # 任务结束 logger.success('<Gevent>任务结束') # 执行一次数据迁移 GeventSchedule().ddt()