影刀RPA进阶教程多任务错峰调度设计——避免机器人自己排队打架一条流程跑两小时五条流程全塞凌晨一点结果三条排队超时两整天白跑——这是我给店群做数据采集时用一周时间才搞明白的教训。影刀RPA的多任务错峰调度本质是让机器人别自己跟自己排队打架这篇从排队机制讲到错峰设计把我现在的排期表直接摊开给你抄。进阶读者应该已经会写流程、会配定时任务了卡住你的是多条任务挤一个机器人之后的连锁反应。先把排队的底层规则搞清楚再谈错峰顺序不能反。排队机制的底层规则10分钟窗口与四种机器人状态官方调度文档里写得很直白机器人处于已分配或运行中状态时继续分配应用会进行排队排队有等待机制默认10分钟。也就是说新任务到点时机器人没空它只等10分钟等不到就废。机器人状态含义新任务进来会怎样空闲无计划执行直接运行不排队已分配领了应用还没开跑排队状态短暂| 运行中 | 正在跑应用 | 排队默认等10分钟 || 离线 | 断网/退出调度模式/退出客户端 | 排队10分钟内上线才执行 |排队的隐藏细节是离线也能入队即使机器人不在线调用也能成功只要10分钟期间机器人连上就执行队列中的任务不会返回错误。这既是容错也是坑——你以为任务会跑实际它默默等了个寂寞。另一个参数是排队优先级priorityAPI调度时可以指定job在等待队列中的优先级默认middle。多条任务抢一个机器人时高优先级的先上这个在排期设计里要主动利用。错峰设计第一原则时间轴上不重叠窗口里留余量错峰的核心不是把任务摊开这么笼统而是两条硬规则相邻两个任务的触发时间间隔 ≥ 前一个任务的预计时长 × 1.5单个流程内部每个等待指令都设超时防止卡死把后面的队列拖穿给每条流程实测出平均时长乘1.5是窗口窗口外才是下一个任务的触发点。我现在的排期表长这样时间任务预计时长留白窗口01:00拼多多商品采集40分钟20分钟02:00淘宝价格监控50分钟10分钟| 03:00 | 小红书笔记采集 | 90分钟 | 0分钟 || 05:00 | 数据汇总入表 | 30分钟 | 30分钟 |凌晨5点那条特意又留了30分钟因为汇总任务依赖前面三条的数据落表任何一条晚点都不能挤压它的窗口。变量层面每条采集流程把开始时间、结束时间写进底表窗口是不是够用跑两周看数据就知道排期表是越跑越准的。触发器全部用Crontab写死比如0 1 * * *、0 2 * * *五段表达式分时日月周别用每小时这种模糊周期。流程内部的防卡死设计超时、兜底与优先级排队打架的第二根源是流程内部卡死。一条本该40分钟的流程卡在某个元素上无限等待排它后面的全遭殃。三个手段堵住网页等待统一用「等待元素出现」并设超时30秒禁止固定等待写长死值While翻页循环加最大轮数变量超轮数强制跳出并输出日志Try-Catch包住主流程Catch里「错误截图」加「输出日志」Finally里关闭浏览器释放资源API调度场景还有个官方给的硬参数runTimeout指定应用运行多长时间后自动停止最小60最大950400秒需要客户端5.10及以上版本专门用来避免应用运行时间不可控或卡死影响排队任务。本地计划没有这个按钮就用流程内的超时设置自己实现同等效果。优先级的用法也说一下把数据汇总这类下游任务设为高优先级采集类设为中低。这样即使偶发重叠排队机制也会先保住依赖链的末端。多机器人分组让打架变成分家一个机器人跑不过来最直接的解法是加机器人。调度管理支持企业下多机器人统一管控计划任务配置时执行机器人可选多个。我的分组策略分组承接任务理由采集组网页采集类吃浏览器环境任务重数据组清洗、入表、报表吃Excel和数据库不抢浏览器应急组补跑、临时验证平时空闲随时可调分组之后计划任务里把应用和机器人对应绑定采集组凌晨跑采集数据组早上跑汇总互不抢资源。机器人管理页面还能查看机器人运行的缩略画面和大图出问题时远程看它卡在哪一步。变量、循环与元素定位错峰流程里的技术底座错峰设计要落地流程本身得稳。变量层面每条流程开头用「获取当前时间」存进字符串变量文件名带时间戳避免多任务写同一个文件互相覆盖——这也是一种隐性打架。循环层面多平台采集用列表变量存平台清单ForEach列表循环逐个跑单平台失败不中断整体。元素定位层面网页列表用「获取相似元素列表」翻页判断用下一页按钮的class是否含disabled# 场景翻页循环里判断下一页按钮是否可点 # 可点时元素存在置灰时class里带disabled判断元素不存在即结束循环 //li[classnext]/a[not(contains(class,disabled))] # CSS选择器等价写法往下找优先用CSS更短 li.next a:not(.disabled)  # 选型口诀往下找用CSS往上找/按文本找用XPath //*[contains(text(),下一页)]/..网页自动化里懒加载列表用index去重加滚动判断滚动后获取相似元素列表长度不再增加就停。数据落表用「写入行数据到表格」追加写量大的平台直接数据库连接三步走建立连接、批量插入、关闭连接。再补一个隐蔽的打架源共享文件和剪切板。两条流程同时读写同一个Excel后写的会报文件被占用「粘贴Excel内容」这类走剪切板的指令在并行时互相覆盖报剪切板内无内容。所以错峰不只是排触发时间资源层面的互斥也要设计——每条流程用自己的文件、自己的目录公共资源只在排期上串行访问。鼠标键盘图像与HTTP能不走UI就不走UI错峰的深层逻辑是缩短每条流程的占用时间窗口自然就宽了。凡是接口能拿的数据用「HTTP请求」指令走GET/POST几秒顶几十步网页操作页面结构乱的平台才用图像识别兜底「添加新图像」截小图配合图像点击截图避开动态区域。鼠标点击一律用驱动模式模拟模式夜里窗口失焦就点空。Python协同负责把各平台数据格式拉齐日期、正则、JSON处理都塞进Python块主流程保持干净。# 输入platforms平台名列表、base_delay基础间隔分钟数# 输出schedule错峰时间表字典供生成Crontab参考fromdatetimeimportdatetime,timedelta platforms[pdd,taobao,xhs]# 平台执行顺序base_delay60# 每个任务间隔60分钟startdatetime.now().replace(hour1,minute0,second0)schedule{}fori,pinenumerate(platforms):tstarttimedelta(minutesbase_delay*i)# 依次错开1小时schedule[p]t.strftime(%H:%M)# 记录触发时刻print(schedule)# {pdd: 01:00, taobao: 02:00, xhs: 03:00}子流程封装与命名规范错峰流程的工程化基础任务一多工程化规范就不是选修课了。我的做法是把每条业务流程拆成主流程子流程结构主流程只负责调度顺序和变量传递打开网页、采集、清洗、写入各成一个子流程主流程里看得清跑到了哪一段配合日志定位就是秒级。命名用编号前缀01_打开列表页、02_采集商品、03_价格清洗、04_写入表格。编号除了排序好看还能直接当日志前缀用输出日志里打02_采集商品 完成共120条三分钟定位那套方法的效率一半来自命名。流程参数的输入输出要定义清楚子流程之间靠参数传数据别用全局变量硬塞多任务并行时全局变量就是打架的另一个源头。模板化是错峰的放大器采集类流程做成通用模板换平台只改定位和翻页两个子流程。我店里四个平台的采集器底层是同一套模板错峰排期表里它们长得一样维护只改一处。平台实战店群四平台的错峰实例拿我现在的店群场景收尾。拼多多、淘宝、小红书、TEMU四条采集线资源特点各不相同拼多多页面结构变化快等待指令全配超时兜底淘宝有滑块类风控采集中间隔加随机延迟小红书列表懒加载严重滚动判断加index去重TEMU是跨境后台登录态检测放流程开头失效就先走登录子流程。排期上按重任务靠前、轻任务殿后凌晨1点拼多多2点淘宝3点半小红书懒加载耗时最长5点TEMU5点45分汇总入表。每条线跑完往运行底表写一行状态第二天日报流程统一出数。这套实例里错峰不是拍脑袋定的是每条线实测时长乘1.5算出来的窗口。监控与告警错峰之后还要看得见错峰排期做完监控必须跟上不然你不知道排期表还有没有效。任务监控页聚合了调度核心数据当前执行应用数、等待执行应用数、今日完成应用数、今日执行异常数加上机器人总数和运行中/空闲/离线分布。等待执行应用数长期不为零就说明排期表已经顶不住了该加机器人或继续拉长间隔。告警通知在任务监控页面点「告警通知」设置支持邮箱、钉钉、企业微信和飞书计划执行异常会自动提醒。API对接的团队还可以用应用运行回调拿终态结果回调失败影刀会连续重试24小时内每小时重试一次重试期间用taskUuid做幂等防重复处理。错峰调度易错速查序号现象根因与解法1后续任务显示等待后失效前任务超10分钟排队窗口按1.5倍时长拉间隔2两条任务写了同一个文件文件名没带时间戳加「获取当前时间」拼文件名3高优先级任务反而后跑priority没设或都为middleAPI调度时显式指定4一条流程卡死拖垮全天等待指令全设超时While加最大轮数兜底5多机器人任务分配不均分组绑定应用与机器人按资源类型分家延伸阅读与源码参考我现用的错峰排期生成脚本和分组配置模板放在代码仓库 home.linyan.cloud可以直接参考改造改平台清单和间隔参数就能生成你自己的排期表。官方文档的调度管理、任务监控两篇配合食用参数含义都有图。#影刀RPA #RPA自动化 #定时任务 #多任务调度 #流程设计作者林焱
阅读完成 · 觉得有帮助?