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)
Esempio n. 2
0
    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))
Esempio n. 3
0
 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()