我想制作一个多线程下载器(用Python),我需要告诉每个线程从哪里开始以及下载多少字节。为此,我获取远程文件大小并将其除以(例如)2。现在,假设远程文件大小为 5:当我将该数字除以 2 时,得到结果 2。现在我可以开始下载,但我会丢失一个字节(因为 2*2=4
,而不是 5)。我无法使用 float ,因为我无法下载半个字节。例如,我如何除以该数字并获得带有 [2, 3]
的列表?
最佳答案
使用divmod
:
>>> divmod(5, 2)
(2, 1)
>>>
这告诉你,5 除以 2 得 2,余数 1,所以最后一 block 将是 2 + 1 = 3。
>>> divmod(12345, 6)
(2057, 3)
在这里,您将在 2057 处获得 5 个 block ,最后一个切片位于 2057+3 处。
该算法也适用于除法没有余数的情况:
>>> divmod(12345, 5)
(2469, 0)
在这里,您将拥有 2469 处的 4 个 block 以及 2469+0 处的最后一个切片。
因此,您的 block 大小可以计算为:
def chunk_sizes(filesize, num_chunks):
d, r = divmod(filesize, num_chunks)
result = [d] * num_chunks
result[-1] += r
return result
关于python - 对文件进行分区以进行并行下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9030601/