Python实现:将API页号范围均匀拆分到指定线程,适配奇偶总页数场景
问题根源
原有逻辑仅给每个线程分配了向下取整的固定页数,没有处理总页数除以线程数的余数,导致总分配页数比实际总页数少余数对应的数量,最终遗漏最后几页。
比如9页2线程的场景,向下取整后每个线程固定分4页,总共仅分配了8页,剩余1页未被分配,最终最后一个线程的结束页比实际需要的少1,无法覆盖第9页。
修正方案
核心逻辑:
- 先计算每个线程的基础分配页数
base = 总页数 // 线程数(等价于原有的math.floor(总页数/线程数)) - 计算余数
remainder = 总页数 % 线程数,将这部分余数按每个线程1页的额度,分配给最后几个线程,保证所有线程的页数差不超过1,符合尽可能均衡的要求 - 结合Python
range左闭右开的特性,每个线程的page_end直接取page_start + 当前分配页数,确保遍历范围完全覆盖所有目标页
修正后的代码
import math # 若不使用math.floor可移除该行 pages = 9 threads = 2 # base = math.floor(pages / threads) 与下方整数除法写法等价 base = pages // threads remainder = pages % threads page_start = 1 for thread_idx in range(threads): # 余数分配给最后remainder个线程,每个多拿1页 current_page_count = base + (1 if thread_idx >= (threads - remainder) else 0) page_end = page_start + current_page_count print(page_start, page_end) # 下一个线程的起始页为当前的结束页 page_start = page_end
注:如果需要将多出来的余数分给靠前的线程,只需将判断条件改为
thread_idx < remainder即可,不影响整体均衡性。
场景验证
奇数总页数(pages=9,threads=2)
输出结果:
1 5 5 10
对应遍历范围:range(1,5)覆盖1-4页,range(5,10)覆盖5-9页,完全符合预期。
偶数总页数(pages=8,threads=2)
输出结果:
1 5 5 9
对应遍历范围:range(1,5)覆盖1-4页,range(5,9)覆盖5-8页,运行正常无异常。
内容的提问来源于stack exchange,提问作者simplycoding
相关产品推荐
相关产品推荐

