Fixed allocation_number (#2768)

* fixed allocation_number

* fixed pre-commit

* fixed line too long

* fixed bug
This commit is contained in:
Du Yuanchao 2020-10-05 11:47:46 +08:00 committed by GitHub
parent e040ad2a01
commit 437c725e64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,37 +1,28 @@
"""
In a multi-threaded download, this algorithm could be used to provide
each worker thread with a block of non-overlapping bytes to download.
For example:
for i in allocation_list:
requests.get(url,headers={'Range':f'bytes={i}'})
"""
from __future__ import annotations
def allocation_num(number_of_bytes: int, partitions: int) -> list[str]:
"""
Divide a number of bytes into x partitions.
:param number_of_bytes: the total of bytes.
:param partitions: the number of partition need to be allocated.
:return: list of bytes to be assigned to each worker thread
In a multi-threaded download, this algorithm could be used to provide
each worker thread with a block of non-overlapping bytes to download.
For example:
for i in allocation_list:
requests.get(url,headers={'Range':f'bytes={i}'})
parameter
------------
: param number_of_bytes
: param partitions
return
------------
: return: list of bytes to be assigned to each worker thread
Examples:
------------
>>> allocation_num(16647, 4)
['0-4161', '4162-8322', '8323-12483', '12484-16647']
>>> allocation_num(888, 888)
Traceback (most recent call last):
...
ValueError: partitions can not >= number_of_bytes!
['1-4161', '4162-8322', '8323-12483', '12484-16647']
>>> allocation_num(50000, 5)
['1-10000', '10001-20000', '20001-30000', '30001-40000', '40001-50000']
>>> allocation_num(888, 999)
Traceback (most recent call last):
...
ValueError: partitions can not >= number_of_bytes!
ValueError: partitions can not > number_of_bytes!
>>> allocation_num(888, -4)
Traceback (most recent call last):
...
@ -39,16 +30,16 @@ def allocation_num(number_of_bytes: int, partitions: int) -> list[str]:
"""
if partitions <= 0:
raise ValueError("partitions must be a positive number!")
if partitions >= number_of_bytes:
raise ValueError("partitions can not >= number_of_bytes!")
if partitions > number_of_bytes:
raise ValueError("partitions can not > number_of_bytes!")
bytes_per_partition = number_of_bytes // partitions
allocation_list = [f"0-{bytes_per_partition}"]
for i in range(1, partitions - 1):
length = f"{bytes_per_partition * i + 1}-{bytes_per_partition * (i + 1)}"
allocation_list.append(length)
allocation_list.append(
f"{(bytes_per_partition * (partitions - 1)) + 1}-" f"{number_of_bytes}"
)
allocation_list = []
for i in range(partitions):
start_bytes = i * bytes_per_partition + 1
end_bytes = (
number_of_bytes if i == partitions - 1 else (i + 1) * bytes_per_partition
)
allocation_list.append(f"{start_bytes}-{end_bytes}")
return allocation_list