def CheckState(): users = list_all_users(0) for acc in users: AR = AutomatorRecorder(acc) uj = AR.getuser() print("USER: "******" TASK: ", "NONE" if uj["taskfile"] == "" else uj["taskfile"], "STATUS ", end="") rs = AR.get_run_status() if rs["error"] is None: if rs["finished"]: print("FINISHED.") else: print("CURRENT: ", rs["current"]) else: print("ERROR: ", rs["error"])
def CheckStateReturn(): users = list_all_users(0) acc_task_info = [] for acc in users: AR = AutomatorRecorder(acc) uj = AR.getuser() acc_task_tmpinfo = "账号:%s 任务:%s 状态:" % (acc, "NONE" if uj["taskfile"] == "" else uj["taskfile"]) rs = AR.get_run_status() if rs["error"] is None: if rs["finished"]: acc_task_tmpinfo = acc_task_tmpinfo + "FINISHED." else: acc_task_tmpinfo = acc_task_tmpinfo + "CURRENT:%s" % rs[ "current"] else: acc_task_tmpinfo = acc_task_tmpinfo + "ERROR:%s" % rs["error"] acc_task_info.append(acc_task_tmpinfo) acc_task_info.append('\n') acc_task_info = ''.join(acc_task_info).replace(',', '\n').replace("'", '') return acc_task_info
def execute(continue_=False, max_retry=3): """ 执行脚本 :param continue_: 是否继续执行上次没执行完的脚本 :param max_retry: 最大报错重试次数 """ try: # 连接adb与uiautomator devices = connect() # 读取账号 all_accounts = readjson() # 读取任务,把有任务的账号加入队列 accounts = [] tasks = [] for acc in all_accounts: AR = AutomatorRecorder(acc) user_dict = AR.getuser() if user_dict["taskfile"] == "": # 无任务,跳过 continue run_status = AR.get_run_status() if run_status["error"] is not None: # 报错 print("账号 ", acc, " 含有未解决的错误:", run_status["error"]) continue elif run_status["finished"]: # 已经完成的 print("账号 ", acc, " 已经完成!跳过。") continue try: tas = AR.gettask(user_dict["taskfile"]) except Exception as e: print("账号 ", acc, " 所读取的任务文件 ", user_dict["task_file"], "有异常:", e, "跳过。") continue # 完好的账号 tasks += [tas] accounts += [acc] print("导入任务: 账号 ", acc, " 任务 ", user_dict["taskfile"], " 进度 ", run_status["current"]) # 这个队列用来保存设备, 初始化的时候先把所有的模拟器设备放入队列 queue = Manager().Queue() # 进程池参数列表 params = list() for acc, tas in zip(accounts, tasks): params.append((acc, tas, queue, continue_, max_retry)) # 初始化队列, 先把所有的模拟器设备放入队列 for device in devices: queue.put(device) # 这里是脱离了runmain的异步 address = queue.get() a = Automator(address) # 传递程序启动的flags Multithreading({}).state_sent_resume() # 随着进程的异步 a.program_start_async() # 放回address queue.put(address) # 进程池大小为模拟器数量, 保证同一时间最多有模拟器数量个进程在运行 if trace_exception_for_debug: runmain(params[0]) else: with Pool(len(devices)) as mp: mp.map(runmain, params) # 传递程序关闭的flags Multithreading({}).state_sent_pause() for _ in range(len(devices)): address = queue.get() a = Automator(address) # 关闭PCR a.d.app_stop("com.bilibili.priconne") # 退出adb os.system('cd adb & adb kill-server') pcr_log('admin').write_log(level='info', message='任务全部完成') pcr_log('admin').server_bot('', message='任务全部完成') if end_shutdown: os.system("shutdown -s -f -t 120") except Exception as e: if trace_exception_for_debug: raise e pcr_log("admin").write_log(level="error", message=f"execute发生了错误:{e}")