SheltonZhu / 115driver

This is a 115 cloud driver package.
MIT License
67 stars 25 forks source link

feat(dir): support concurrent for `List` #19

Closed Aruelius closed 10 months ago

Aruelius commented 10 months ago

新增 ListWithMultiThreads 方法,更快获取文件夹内容

获取文件夹下的 2967 个文件列表,正常循环大概需要十多秒,并发获取不到一秒

Aruelius commented 10 months ago
PASS
ok      115driver/pkg/driver    1.058s
SheltonZhu commented 10 months ago

新增 ListWithMultiThreads 方法,更快获取文件夹内容

获取文件夹下的 2967 个文件列表,正常循环大概需要十多秒,并发获取不到一秒

要考虑下两个问题,并发可能会触发waf拦截,有封号风险,另外就是这个错误处理直接return了?

Aruelius commented 10 months ago

确实会触发防火墙,但是我只在 Alist 重建索引的时候被触发了,大概 6000+ 文件,测试的时候频率几秒钟一次没触发。

错误那边如果第一个请求失败了,那就是正常返回错误

return nil, err

后续协程里的如果遇到错误,这种情况大概率是遇到防火墙,不返回也可以,比如 50 个请求,错了 1 个,与其返回空,不如把那 49 个的结果返回。

SheltonZhu commented 10 months ago

确实会触发防火墙,但是我只在 Alist 重建索引的时候被触发了,大概 6000+ 文件,测试的时候频率几秒钟一次没触发。

错误那边如果第一个请求失败了,那就是正常返回错误

return nil, err

后续协程里的如果遇到错误,这种情况大概率是遇到防火墙,不返回也可以,比如 50 个请求,错了 1 个,与其返回空,不如把那 49 个的结果返回。

那至少也应该可以设置并发数量, 一批一批的去处理, 而不是全部并发处理, 触发waf的几率会小一点.

而且list all 这种比较特殊的需求, 我觉得应该交给下游自己实现就好, lib中提供ListPage()就好, 目前已经有的List() 因为已经在用了, 所以没有删除, 函数之后全都暴露出来, , 后面会把(&File{}).from(&fileInfo) 函数暴露出来, 所以你这个在外部应该也是可以实现的

Aruelius commented 10 months ago

确实会触发防火墙,但是我只在 Alist 重建索引的时候被触发了,大概 6000+ 文件,测试的时候频率几秒钟一次没触发。 错误那边如果第一个请求失败了,那就是正常返回错误

return nil, err

后续协程里的如果遇到错误,这种情况大概率是遇到防火墙,不返回也可以,比如 50 个请求,错了 1 个,与其返回空,不如把那 49 个的结果返回。

那至少也应该可以设置并发数量, 一批一批的去处理, 而不是全部并发处理, 触发waf的几率会小一点.

而且list all 这种比较特殊的需求, 我觉得应该交给下游自己实现就好, lib中提供ListPage()就好, 目前已经有的List() 因为已经在用了, 所以没有删除, 函数之后全都暴露出来, , 后面会把(&File{}).from(&fileInfo) 函数暴露出来, 所以你这个在外部应该也是可以实现的

我也觉得,其实写这个方法的主要原因是因为 Alist 那边好像没有正经的后端分页,每次在没缓存的情况下打开文件数量多的文件夹都加载老半天

SheltonZhu commented 10 months ago

问过作者了,他说因为webdav没有分页

因为webdav没有分页的协议(可能有我不知道?) 所以现在的实现都是一次拿所有

Aruelius commented 10 months ago

原来如此