2012-01-27 52 views
2

我想製作一個多線程下載器(使用Python),我需要告訴每個線程從何處開始以及要下載多少字節。爲此,我得到遠程文件的大小,並將其分成例如2.現在,假設遠程文件大小爲5:當我將數字除以2時,結果爲2。現在我可以開始下載了,但是我會丟失一個字節(因爲2*2=4,而不是5)。我無法使用浮點數,因爲我無法下載一半字節。例如,我可以將這個數字除以[2, 3]以獲得一個列表嗎?爲並行下載分區文件

回答

3

使用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) 

在這裏,你將不得不在2469 4塊加上2469 + 0最後切片。

所以,你的塊大小可以被計算爲:

def chunk_sizes(filesize, num_chunks): 
    d, r = divmod(filesize, num_chunks) 
    result = [d] * num_chunks 
    result[-1] += r 
    return result 
0

特殊情況下的最後一個線程 - 分配給它,但是留下很多字節。

1

如果你想獲得每塊的大小,你可以簡單的除法的餘數加入到最後一個元素:

>>> 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]