LibTorrent选择性下载时显示仅完成1个文件 执行后实际存储2个文件
异常根因
出现Drive目录下实际存了2个剧集文件、但Colab进度界面只标记1个文件下载完成的问题,核心是重复添加种子时复用了旧的任务句柄、优先级设置没有全局重置导致的下载残留。
异常触发的完整逻辑流
- 每次执行
SelectiveDownload函数时,都会调用ses.add_torrent()把同一个种子挂载到相同的Drive路径下。LibTorrent的session会对相同info_hash的种子自动去重:如果session里已经存在对应种子的下载任务,add_torrent不会创建新的独立任务,直接返回已经存在的旧任务句柄。 - 第一次循环下载第一个剧集文件时,你新建了种子任务,只给目标文件对应的piece设置了最高优先级、其他piece设为0。等目标文件下载完成后,你没有把这个旧任务从session里移除,任务会一直挂在后台保持活跃。
- 第二次循环下载第二个剧集文件时,
add_torrent返回的是上一次留下的旧任务句柄。你给第二个文件对应的piece设置高优先级时,没有把第一次已经下完的第一个文件对应的piece优先级重新清零,加上LibTorrent默认所有文件的初始下载优先级是最高级,旧的高优先级状态没有被清除,session会自动把对应piece的内容写入磁盘。 - 你的进度打印逻辑只跟踪当前旧句柄的整体进度,等第二个目标文件的piece下载完成就直接跳出循环,完全不会识别到之前已经下载好的第一个文件的残留内容,已经被写入挂载的Drive目录。
修复方案
- 每次单文件下载完成后,必须手动把当前种子任务从session中移除,避免重复添加时拿到旧句柄。在进度判断跳出循环的位置,加上任务移除逻辑:
# 下载完成后移除任务,避免后台残留 ses.remove_torrent(h, lt.session.options_t.delete_files) - 每次设置piece优先级前,先把整个种子所有piece的优先级重置为0,再给当前需要下载的目标piece设置最高优先级,从根源上避免之前残留的优先级设置生效:
# 全局重置所有piece优先级为0(不主动下载) for i in range(info.num_pieces()): h.piece_priority(i, 0) # 再给当前目标文件对应的piece设置最高优先级 for i in range(int(pr.piece), int(pr.piece + n_pieces)): h.piece_priority(i, 7) - 增加文件级别的优先级兜底,不要只依赖piece级别的设置。拿到种子句柄后,先把所有文件的优先级设为0(完全不下载),再单独把当前目标文件的优先级设为最高,和piece优先级做双重校验:
# 全局设置所有文件为不下载 for file_idx in range(info.num_files()): h.file_priority(file_idx, 0) # 单独给当前目标文件开放最高下载权限 h.file_priority(fileIndex, 7) - 计算目标文件对应的piece范围时,注意校验跨文件边界的piece覆盖,避免把属于其他文件的跨边界piece漏在高优先级范围内。
内容的提问来源于stack exchange,提问作者Muhammad
相关产品推荐
相关产品推荐

