You need to enable JavaScript to run this app. LibTorrent选择性下载时显示仅完成1个文件 执行后实际存储2个文件
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 14:54:10