上传和下载并发控制设计与实现

December 14, 2025
2 min read
By devshan

Table of Contents

This is a list of all the sections in this post. Click on any of them to jump to that section.

问题背景

默认情况下,上传和下载任务都是按代码里固定的并发度执行,例如固定 3 个并发。
在实测中发现:

  • 在网络/磁盘较弱的设备上,并发过高会带来明显卡顿和失败;
  • 在性能较强的设备上,又希望能提高并发度来加快整体速度。

使用上需要一个简单的方式,能根据自己的环境调节上传/下载并发。

目标

  • 在设置页提供两个滑动条:
    • 上传并发:范围 1–30;
    • 下载并发:范围 1–30。
  • 并发设置要持久化,下次启动生效;
  • 传输调度逻辑要遵守这个并发上限。

方案设计

状态层并发调度模型

  • AppState 中维护:
    • 配置:_uploadConcurrency_downloadConcurrency
    • 运行时计数:_runningUploads_runningDownloads
    • 排队队列:上传队列 _uploadQueue、下载队列 _downloadQueue
  • 新任务加入时:
    • 如果当前运行数 < 并发上限,立即启动;
    • 否则进入队列等待。
  • 每个任务结束时:
    • 递减对应的 running 计数;
    • 尝试从队列中取出下一个任务启动,直到达到并发上限。

这样可以保证最大并发数可配置且不会超限

设置页 UI 与持久化

  • 设置页增加两个 Slider
    • 最小值 1,最大值 30,divisions=29;
    • 当前值来自 AppState 的并发配置。
  • 每次滑动时:
    • 调用 setUploadConcurrency / setDownloadConcurrency 更新状态;
    • 同时写入 SharedPreferences 对应的 key;
    • 下次启动时在 _loadPreferences 中加载,夹在 1–30 范围内。

收获

  • 把“并发度”开放出来,可以适配不同设备和网络,不必用一个固定值硬撑所有场景。
  • 实现上要区分:
    • 配置层面的并发上限
    • 运行时的执行调度(队列 + running 计数)。
      清楚这两个角色后,代码结构会比较自然。