并发与池
🏊 浏览器复用与并发控制。
浏览器是昂贵资源,snir 提供多层复用机制。
为什么需要复用
每起一个 Chrome 进程约占 ~150MB 内存。批量场景下若每任务起停一次浏览器,几十并发就会吃满机器。复用是 snir 性能的核心。
复用层次
| 层次 | 机制 | 范围 |
|---|---|---|
| 进程内 | DriverPool | 同进程多任务 |
| 进程内单例 | 共享池(Shared*) | 同进程全局 |
| 跨进程 | snir provider | 多进程共享 Chrome |
进程内:DriverPool
DriverPool 管理一批 Driver,任务借还复用:
--threads(CLI)/ maxConcurrent(SDK)控制并发度。
共享池单例
SDK Shared* 函数用进程内全局共享池,多任务自动复用:
go
sdk.SharedCapture(url, opts) // 自动用共享池跨进程:Provider
bash
snir provider --max-concurrent 20
# worker
snir scan ... --wss ws://...API 并发限流
HTTP API 用 ConcurrencyLimiter:
--max-concurrent:同时执行数--queue-size:排队容量
见 并发限流。
池统计
SharedPoolStats():SDK 共享池统计GET /stats:API 并发统计PoolStats:DriverPool 统计
空闲超时
SharedSetIdleTimeout(d) 设浏览器空闲多久后关闭,节省资源。
并发数选择
| 机器 | 建议 --threads |
|---|---|
| 🖥️ 4 核 | 5-10 |
| 🖥️ 8 核 | 10-20 |
| 🖥️ 服务器 | 20-50 |
并发不是越高越好
过多会触发目标限流或耗尽内存。从 5-10 起步,观察目标响应与机器负载再调。见 性能调优。
池中一个 Driver 从空闲到回收的生命周期: