我想做一个多线程下载器(在Python中),我需要告诉每个线程从哪里开始,下载多少字节。为此,我得到远程文件大小,并将其除以2。现在,假设远程文件大小为5:当我将该数字除以2时,结果为2。现在我可以开始下载了,但是我会丢失一个字节(因为2*2=4,而不是5)。我不能使用浮点数,因为我不能下载半个字节。例如,我如何用[2, 3]除以这个数字并得到一个列表?
发布于 2012-01-27 16:28:47
使用divmod
>>> divmod(5, 2)
(2, 1)
>>>这告诉你,5除以2是2,余数是1,所以最后一块是2+1= 3。
>>> divmod(12345, 6)
(2057, 3)在这里,你将在2057年有5个块,在2057+3有最后一块。
此算法也适用于除法没有余数的情况:
>>> divmod(12345, 5)
(2469, 0)在这里,你将有4个块在2469,加上最后一个切片在2469+0。
因此,您的块大小可以计算为:
def chunk_sizes(filesize, num_chunks):
d, r = divmod(filesize, num_chunks)
result = [d] * num_chunks
result[-1] += r
return result发布于 2012-01-27 16:29:17
如果想要得到每个块的大小,可以简单地将除法的剩余部分添加到最后一个元素:
>>> file_size = 11
>>> no_of_chunks = 3
>>> chunks = [file_size / no_of_chunks] * no_of_chunks
>>> chunks[-1] += file_size % no_of_chunks
>>> chunks
[3, 3, 5]您还可以对其进行修改,以将剩余部分分布到所有块中,以便块的大小最多偏离1:
>>> for i in range(file_size % no_of_chunks):
>>> chunks[i] += 1
>>> chunks
[4, 4, 3]发布于 2012-01-27 16:25:35
特殊情况下,最后一个线程--分配它来获取剩余的字节数。
https://stackoverflow.com/questions/9030601
复制相似问题