def run_check(self) -> 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: """ vsu( core=GeventSchedule( go=self.speed_up), # 此项加速设置用于限制同一类型任务的所有节点的并发行为 user_cluster=self.check_seq, interface='run_check').run(self.speed_up) # 此项加速设置用于限制多类任务的并发行为 logger.success('<Gevent>任务结束')
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()
def loads_task(class_: str = '', use_plugin: bool = False, one_step=False, startup=True, loads_=True, at_once=True) -> bool: """ 加载任务 @param at_once: @param loads_: @param startup: @param one_step: @param class_: 任务类型,必须在 crawler seq内,如 ssr,v2ray or trojan @param use_plugin: 使用加速插件 @return: """ # 检查输入 if class_ not in CRAWLER_SEQUENCE or not isinstance(class_, str): return False # 加载任务 if loads_: # 刷新节点 read_actions(class_) # 乱序入队 exec("import random\nrandom.shuffle(eval('task_' + class_))") for task_name in eval("task_" + class_): expr = f'from BusinessLogicLayer.cluster.slavers.actions import {task_name}\n' \ f'{task_name}(at_once={at_once}).run()' Middleware.poseidon.put_nowait(expr) if one_step: break # 启动任务 if startup: # 如果使用插件加速,则调入speed_up封装方法 # 否则按list顺序执行 vsu(core=PuppetCore(), docker=Middleware.poseidon).run(use_plugin) return True
def manage_task(class_: str = 'v2ray', speedup: bool = True, only_sync=False, startup=None, beat_sync=True, force_run=None) -> bool: """ 加载任务 @param force_run: debug模式下的强制运行,可逃逸队列满载检测 @param startup:创建协程工作空间,并开始并发执行队列任务。 @param only_sync:节拍同步线程锁。当本机任务数大于0时,将1枚原子任务推送至Poseidon协程空间。 @param class_: 任务类型,必须在 crawler seq内,如 ssr,v2ray or trojan。 @param speedup: 使用加速插件。默认使用coroutine-speedup。 @param beat_sync: @return: """ # ---------------------------------------------------- # 参数审查与转译 # ---------------------------------------------------- # 检查输入 if class_ not in CRAWLER_SEQUENCE or not isinstance(class_, str): return False # 审核采集权限,允许越权传参。当手动指定参数时,可授予本机采集权限,否则使用配置权限 local_work: bool = startup if startup else ENABLE_DEPLOY.get('tasks').get( 'collector') # 强制运行:指定参数优先级更高,若不指定则以是否单机部署模式决定运行force_run是否开启 # 默认单机模式下开启force_run # 若未传参时也未定义部署形式(null),则默认不使用force_run force_run = force_run if force_run else SINGLE_DEPLOYMENT # ---------------------------------------------------- # 解析同步模式 # ---------------------------------------------------- # 以本机是否有采集权限来区分download 以及upload两种同步模式 mode_sync = "download" if local_work else "upload" # 以更高优先级的`force_run` 替代传统同步模式,执行强制采集方案 mode_sync = "force_run" if force_run else mode_sync # ---------------------------------------------------- # 同步消息(任务)队列 # ---------------------------------------------------- # 当本机可采集时,将任务同步至本机执行,若消息队列为空则 # 若本机不可采集,则生成任务加入消息队列 response: str or bool = _sync_actions( class_=class_, only_sync=only_sync, beat_sync=beat_sync, mode_sync=mode_sync, ) # ---------------------------------------------------- # 初始化协程空间(执行任务) # ---------------------------------------------------- # 若本机开启了采集器权限则创建协程空间 # 若从control-deploy进入此函数,则说明本机必定具备创建协程空间权限 if force_run: if response == 'offload': logger.info(f'<TaskManager> ForceRun || <{class_}>采集任务启动') vsu(core=PuppetCore(), docker=Middleware.poseidon).run(speedup) logger.success(f'<TaskManager> ForceWorkFinish || <{class_}>采集任务结束') return True # if 'force_run' is False and the node has the permissions of collector if local_work: # if task queue can be work if response == 'offload': logger.info(f'<TaskManager> Run || <{class_}>采集任务启动') vsu(core=PuppetCore(), docker=Middleware.poseidon).run(speedup) logger.success(f'<TaskManager> Finish || <{class_}>采集任务结束') return True else: logger.warning(f"<TaskManager> Hijack<{class_}> || 当前节点不具备采集权限") return False