fix: 解析大画廊时连接泄漏 + 解析阶段无进度反馈
用户反馈:点开始下载后 6 个画廊(都是 2000 张级)一直显示「解析中 0/?」, 看起来像卡死。排查发现两个问题: 1. 连接泄漏(真 bug) httpClient() 每次请求都新建 http.Transport,用完丢弃。Transport 被丢弃后 它持有的 keep-alive 连接不会立刻释放(要等 IdleConnTimeout=90s), 于是每发一个请求留下一条僵尸连接。 现场实测:91 条 Established 连接,而解析是串行的,正常应该只有 1 条。 修复:Transport 全局复用,只在代理配置变化时重建, 重建时 CloseIdleConnections 关掉旧连接;新增 Client.Close()。 实测:20 次请求从 20 条连接降到 1 条;100 次并发请求只用 22 条。 2. 解析阶段毫无反馈 2000 张 = 100 屏串行翻页,整个解析阶段界面都显示「解析中 0/?」, 完全没有进度,用户只能干等。 修复:FetchGalleryPage 增加 ParseProgress 回调,每翻完一屏上报一次 (已解析张数/总张数/当前屏),界面显示「已解析 340/2000 张」。 另外:用户设置里请求间隔是 1000ms(1 秒),全局限流让 5 个画廊共享 1 请求/秒 —— 500 次解析请求需要约 8 分钟。这是配置导致的慢,不是 bug, 但可以在界面上看到进度后就不会以为卡死了。 测试从 74 增至 80,新增: - TestTransportIsReused / TestTransportReusedUnderConcurrency(连接复用) - TestSetProxyRebuildsTransport(改代理要重建) - TestParseProgressCallback(进度回调,含最后一屏)
This commit is contained in:
@@ -110,7 +110,7 @@ func TestFetchGalleryPagePagination(t *testing.T) {
|
||||
defer func() { EHBase = oldBase }()
|
||||
|
||||
c := NewClient(5*time.Second, "", "off", "auto")
|
||||
g, err := c.FetchGalleryPage(context.Background(), gid, tok)
|
||||
g, err := c.FetchGalleryPage(context.Background(), gid, tok, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("FetchGalleryPage 失败: %v", err)
|
||||
}
|
||||
@@ -283,7 +283,7 @@ func TestFetchGalleryRestricted(t *testing.T) {
|
||||
defer func() { EHBase = oldBase }()
|
||||
|
||||
c := NewClient(5*time.Second, "", "off", "auto")
|
||||
_, err := c.FetchGalleryPage(context.Background(), "12345678", "abc")
|
||||
_, err := c.FetchGalleryPage(context.Background(), "12345678", "abc", nil)
|
||||
if err == nil {
|
||||
t.Fatal("受限画廊应该报错")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user