logo

Простий багатопоточний менеджер завантажень на Python

А Менеджер завантажень це в основному комп’ютерна програма, призначена для завантаження окремих файлів з Інтернету. Тут ми збираємося створити простий менеджер завантажень за допомогою потоків на Python. Використовуючи багатопотоковість, файл можна завантажувати у вигляді фрагментів одночасно з різних потоків. Щоб реалізувати це, ми створимо простий інструмент командного рядка, який приймає URL-адресу файлу, а потім завантажує його.

Необхідні умови: машина Windows із встановленим Python.



Налаштування

Завантажте наведені нижче пакети з командного рядка.

підрядок рядка java

1. Пакет Click: Click — це пакет Python для створення красивих інтерфейсів командного рядка з мінімальною кількістю коду. Це набір для створення інтерфейсу командного рядка.

pip install click



2. Пакет запитів: у цьому інструменті ми збираємося завантажити файл на основі URL-адреси (HTTP-адреси). Requests — це бібліотека HTTP, написана мовою Python, яка дозволяє надсилати HTTP-запити. Ви можете додавати заголовки до файлів, що складаються з даних, і параметрів за допомогою простих словників Python і таким же чином отримувати доступ до даних відповіді.

запити встановлення pip

3. Пакет Threading: Для роботи з потоками нам потрібен пакет Threading.



pip install threading

Реалізація

Примітка:

dhl означає що

Програму було розділено на частини, щоб було легше зрозуміти. Переконайтеся, що ви не пропускаєте жодної частини коду під час роботи програми.

Крок 1. Імпортуйте необхідні пакети

Ці пакети надають необхідні інструменти, щоб змусити веб-запити обробляти вхідні дані командного рядка та створювати потоки.

створення списку в java
Python
import click import requests import threading 

Крок 2: Створіть функцію обробки

Кожен потік виконає цю функцію, щоб завантажити певну частину файлу. Ця функція відповідає за запит лише певного діапазону байтів і запис їх у правильну позицію у файлі.

Python
def Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content) 

Крок 3: Визначте основну функцію за допомогою клацання

Перетворює функцію на утиліту командного рядка. Це визначає, як користувачі взаємодіють зі сценарієм із командного рядка.

Python
#Note: This code will not work on online IDE @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads): 

Крок 4: Встановіть назву файлу та визначте розмір файлу

Нам потрібен розмір файлу, щоб розділити завантаження між потоками та переконатися, що сервер підтримує діапазонні завантаження.

Python
 r = requests.head(url_of_file) file_name = name if name else url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return 

Крок 5: Попередньо розподіліть місце для файлів

Попереднє виділення гарантує, що файл має правильний розмір, перш ніж ми запишемо фрагменти в певні діапазони байтів.

Python
 part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'' * file_size) 

Крок 6: Створення потоків

Потокам призначаються певні діапазони байтів для паралельного завантаження.

Python
 threads = [] for i in range(number_of_threads): start = part * i end = file_size - 1 if i == number_of_threads - 1 else (start + part - 1) t = threading.Thread(target=Handler kwargs={ 'start': start 'end': end 'url': url_of_file 'filename': file_name }) threads.append(t) t.start() 

Крок 7: Приєднайтеся до потоків

Забезпечує завершення всіх потоків до завершення програми.

Python
 for t in threads: t.join() print(f'{file_name} downloaded successfully!') if __name__ == '__main__': download_file() 

код:

громадянство Піта Девідсона
Python
import click import requests import threading def Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content) @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads): r = requests.head(url_of_file) if name: file_name = name else: file_name = url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'' * file_size) threads = [] for i in range(number_of_threads): start = part * i # Make sure the last part downloads till the end of file end = file_size - 1 if i == number_of_threads - 1 else (start + part - 1) t = threading.Thread(target=Handler kwargs={ 'start': start 'end': end 'url': url_of_file 'filename': file_name }) threads.append(t) t.start() for t in threads: t.join() print(f'{file_name} downloaded successfully!') if __name__ == '__main__': download_file() 


Ми закінчили з частиною кодування, і тепер виконайте наведені нижче команди, щоб запустити файл .py.

python filename.py –-help

Вихід:

help_output' title=python filename.py –-help


Ця команда показує використання інструмента команди клацання та параметри, які цей інструмент може приймати. Нижче наведено зразок команди, у якій ми намагаємося завантажити файл зображення jpg з URL-адреси, а також вказуємо ім’я та кількість_потоків.

Скріншот-2025-04-07-155058' loading='lazy' title=зразок команди для завантаження jpg

Після успішного виконання всіх завдань ви зможете побачити свій файл (у цьому випадку flower.webp) у каталозі папки, як показано нижче:

Скріншот-2025-04-07-155750' loading='lazy' title=каталог

Нарешті ми успішно закінчили це, і це один із способів створити простий багатопоточний менеджер завантажень на Python.