python - 对文件进行分区以进行并行下载

标签 python floating-point numbers int division

我想制作一个多线程下载器(用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/

相关文章:

python - Py2exe、Tkinter 和安装文件有问题吗?

python传递列表作为函数参数

python - 如何使用 Python 在 MapReduce 中的 reducer 中输出键值对,以便 1 小时内的时间结束?

java - 如何通过TCP/IP通信Java和Labview,并发送 float 据缓冲区?

c++ - float 的类内静态 const 初始化与 C++ 中的 int 有何不同?

python - 为什么 1//0.1 == 9.0?

java - 如何使用 compare() 方法比较两个 Double 对象的值?

ruby - 解析 Ruby 时查找数字模式

c - 如何在函数之间传递这个数字? C

python - tensorflow 中的二进制阈值激活函数