TheAlgorithms-Python
50 строк · 1.7 Кб
1"""
2In a multi-threaded download, this algorithm could be used to provide
3each worker thread with a block of non-overlapping bytes to download.
4For example:
5for i in allocation_list:
6requests.get(url,headers={'Range':f'bytes={i}'})
7"""
8
9from __future__ import annotations10
11
12def allocation_num(number_of_bytes: int, partitions: int) -> list[str]:13"""14Divide a number of bytes into x partitions.
15:param number_of_bytes: the total of bytes.
16:param partitions: the number of partition need to be allocated.
17:return: list of bytes to be assigned to each worker thread
18
19>>> allocation_num(16647, 4)
20['1-4161', '4162-8322', '8323-12483', '12484-16647']
21>>> allocation_num(50000, 5)
22['1-10000', '10001-20000', '20001-30000', '30001-40000', '40001-50000']
23>>> allocation_num(888, 999)
24Traceback (most recent call last):
25...
26ValueError: partitions can not > number_of_bytes!
27>>> allocation_num(888, -4)
28Traceback (most recent call last):
29...
30ValueError: partitions must be a positive number!
31"""
32if partitions <= 0:33raise ValueError("partitions must be a positive number!")34if partitions > number_of_bytes:35raise ValueError("partitions can not > number_of_bytes!")36bytes_per_partition = number_of_bytes // partitions37allocation_list = []38for i in range(partitions):39start_bytes = i * bytes_per_partition + 140end_bytes = (41number_of_bytes if i == partitions - 1 else (i + 1) * bytes_per_partition42)43allocation_list.append(f"{start_bytes}-{end_bytes}")44return allocation_list45
46
47if __name__ == "__main__":48import doctest49
50doctest.testmod()51