TheAlgorithms-Python

Форк
0
/
allocation_number.py 
50 строк · 1.7 Кб
1
"""
2
In a multi-threaded download, this algorithm could be used to provide
3
each worker thread with a block of non-overlapping bytes to download.
4
For example:
5
    for i in allocation_list:
6
        requests.get(url,headers={'Range':f'bytes={i}'})
7
"""
8

9
from __future__ import annotations
10

11

12
def allocation_num(number_of_bytes: int, partitions: int) -> list[str]:
13
    """
14
    Divide 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)
24
    Traceback (most recent call last):
25
        ...
26
    ValueError: partitions can not > number_of_bytes!
27
    >>> allocation_num(888, -4)
28
    Traceback (most recent call last):
29
        ...
30
    ValueError: partitions must be a positive number!
31
    """
32
    if partitions <= 0:
33
        raise ValueError("partitions must be a positive number!")
34
    if partitions > number_of_bytes:
35
        raise ValueError("partitions can not > number_of_bytes!")
36
    bytes_per_partition = number_of_bytes // partitions
37
    allocation_list = []
38
    for i in range(partitions):
39
        start_bytes = i * bytes_per_partition + 1
40
        end_bytes = (
41
            number_of_bytes if i == partitions - 1 else (i + 1) * bytes_per_partition
42
        )
43
        allocation_list.append(f"{start_bytes}-{end_bytes}")
44
    return allocation_list
45

46

47
if __name__ == "__main__":
48
    import doctest
49

50
    doctest.testmod()
51

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.