本帖最后由 韦贝贝 于 2026-7-31 13:10 编辑
起因是鱼刺的哪个模块老在那边空获取代理,代理被压入了也没开启验证,但是可用代理始终是0,导致代理白白的浪费几千,无奈之下让AI完全参考鱼刺爱偷懒的模块写了一个
全程靠 AI 搭框架写的,前后调了 5-6 次就跑通了,后续又针对性修复了几轮边界问题和性能问题,现在多线程压测稳定
一、模块核心功能
这是一个完整的代理提取 + 验证 + 池化管理模块,常用功能都覆盖了:
- 支持最多 5 组代理提取地址,自动轮询提取
- 支持「分隔符分割」和「正则匹配」两种解析方式,内置 IP: 端口格式合法性校验
- 内置多线程验证池,可自定义验证地址、响应特征串、超时时间、失败重试次数
- 代理生命值机制:单条代理可配置复用次数,用完自动从池中移除
- 代理最长存活时间(MaxAge):到期自动清理过期代理
- 两种获取模式:
- 普通模式:自动扣减生命值,用完自动删除
- Ex 自取出模式:代理从池中完全移出,自行判断有效性后手动归还
- 支持自定义去重回调,可自行实现全局去重逻辑
- 代理池低于阈值自动触发补充,提取最小间隔可配置,避免请求过快
二、开发 & 踩坑历程
全程 AI 辅助开发,踩的坑都是易语言多线程经典问题,这里也列出来给大家避坑:
- 初稿成型:从 0 到 1 搭完整个模块框架,包括提取线程、验证线程、代理池管理、临界区保护,前后调试了 5-6 次就跑通了主流程,提取→验证→入池→获取全链路正常。
- 修复 CPU 100% 问题:初期空转时 CPU 直接拉满,排查发现易语言自带的 延迟() 是忙等待实现,把所有线程内的等待全部替换成基于内核定时器的 程序_延时(),空闲 CPU 直接降到几乎为 0。
- 修复数组越界崩溃:高并发下偶现下标越界,根源是「正向遍历数组 + 循环内删除成员」的写法有先天缺陷,把所有遍历删除的逻辑全部改成倒序变量循环,从根源上杜绝越界问题。
- 修复生命值逻辑:理顺 获取代理Ex 的生命值机制,取出时自动扣减 1 点生命值,归还时自动过滤生命值≤0 的代理,和普通获取模式的逻辑对齐,避免代理无限复用。
- 优化事件惊群:调整事件通知逻辑,只有代理池从空变非空时才触发事件,避免大量等待线程同时唤醒抢锁,减少无意义的 CPU 消耗。
- 多线程压测验证:开满验证线程 + 多线程并发获取代理,连续跑数小时无崩溃、无内存泄漏、计数正常,确认稳定可用。
代理智能提取_置代理提取参数 (1, “https://www.hibbba.com/”, #换行符, 假, 真, 假, , 1000, , , , ) 代理智能提取_置代理验证参数 (“https://www.baidu.com/”, “html”, 真, 假, , “GET”, 100, 10, 1 ) 代理智能提取_置代理生命值 (5 ) 代理智能提取_置代理最长存活时间 (-1 ) 代理智能提取_置代理过滤重复回调 (到整数 (&过滤重复代理回调 ), 假)代理智能提取_创建 (假)程序_延时 (2000 ) 计次循环首 (1, i ) 启动线程 (&自动_工作线程, i, ) 计次循环尾 () 程序_延时 (60000 ) 代理智能提取_销毁 ()| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 代理信息 | 文本型 | | | | bool | 逻辑型 | | |
计次循环首 (100, )  循环判断首 ()  bool = 代理智能提取_获取代理 (代理信息, 1000 × 10 )  如果真 (bool = 假)  到循环尾 () 输出调试文本 (“获取到代理: ” + 代理信息)  bool = 调用_干活 (代理信息 ) 循环判断尾 (bool = 假) 调试输出 (“代理智能提取_取已提取数 ()”, 代理智能提取_取已提取数 ()) 调试输出 (“代理智能提取_取本次提取数 ()”, 代理智能提取_取本次提取数 ()) 调试输出 (“代理智能提取_取当前剩余数 ()”, 代理智能提取_取当前剩余数 ()) 调试输出 (“代理智能提取_取验证成功数 ()”, 代理智能提取_取验证成功数 ()) 调试输出 (“代理智能提取_取正在验证数 ()”, 代理智能提取_取正在验证数 ()) 程序_延时 (1000 ) 计次循环尾 () 调试输出 (IP地址, 端口 )置随机数种子 () 如果真 (取随机数 (1, 10 ) < 5 ) 返回 (假) 返回 (真)
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | | 代理信息 | 文本型 | | | | 代理相关信息 | 代理智能提取信息 | | | | bool | 逻辑型 | | |
计次循环首 (100, ) 调试输出 (“代理智能提取_取当前剩余数 ()”, 代理智能提取_取当前剩余数 ())  bool = 代理智能提取_获取代理Ex (代理信息, 代理相关信息, 1000 × 10 ) 调试输出 (bool ) 如果真 (bool = 真) 输出调试文本 (“获取到代理: ” + 代理信息 )  bool = 调用_干活 (代理信息 )    如果真 (bool = 真)        代理智能提取_自压入代理Ex (代理相关信息 )   调试输出 (bool) 调试输出 (“代理智能提取_取当前剩余数 ()”, 代理智能提取_取当前剩余数 ()) 调试输出 (bool ) 调试输出 (“代理智能提取_取已提取数 ()”, 代理智能提取_取已提取数 ()) 调试输出 (“代理智能提取_取本次提取数 ()”, 代理智能提取_取本次提取数 ()) 调试输出 (“代理智能提取_取当前剩余数 ()”, 代理智能提取_取当前剩余数 ()) 调试输出 (“代理智能提取_取验证成功数 ()”, 代理智能提取_取验证成功数 ()) 调试输出 (“代理智能提取_取正在验证数 ()”, 代理智能提取_取正在验证数 ()) 程序_延时 (1000 ) 计次循环尾 ()置随机数种子 () 如果真 (取随机数 (1, 10 ) < 5 ) 返回 (假) 返回 (真)
|