logo

Једноставан вишенитни менаџер преузимања у Питхон-у

А Довнлоад Манагер је у основи рачунарски програм посвећен задатку преузимања самосталних датотека са интернета. Овде ћемо направити једноставан Менаџер преузимања уз помоћ нити у Питхон-у. Коришћењем вишенитног рада датотека се може преузети у облику комада истовремено из различитих нити. Да бисмо ово применили, направићемо једноставну алатку командне линије која прихвата УРЛ датотеке и затим је преузима.

Предуслови: Виндовс машина са инсталираним Питхон-ом.



Сетуп

Преузмите доле наведене пакете из командне линије.

1. Кликните пакет: Цлицк је Питхон пакет за креирање прелепих интерфејса командне линије са што мање кода колико је потребно. То је комплет за креирање интерфејса командне линије.

пип инсталл кликните



2. Захтеви пакет: У овом алату ћемо преузети датотеку на основу УРЛ-а (ХТТП адресе). Захтеви су ХТТП библиотека написана у Питхон-у која вам омогућава да шаљете ХТТП захтеве. Можете додати заглавља у вишеделне датотеке и параметре са подацима са једноставним Питхон речницима и приступити подацима одговора на исти начин.

захтеви за инсталацију пип-а

3. Тхреадинг пакет: За рад са нитима потребан нам је тхреадинг пакет.



јава пример подниза

пип инсталл тхреадинг

Имплементација

Напомена:

Програм је подељен на делове да би се лакше разумео. Уверите се да вам не недостаје ниједан део кода док покрећете програм.

Корак 1: Увезите потребне пакете

Ови пакети обезбеђују неопходне алате да би веб захтеви руковали уносима командне линије и креирали нити.

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() 


Завршили смо са делом кодирања и сада следите команде приказане у наставку да бисте покренули .пи датотеку.

python filename.py –-help

Излаз:

хелп_оутпут' title=питхон филенаме.пи –-хелп


Ова команда приказује употребу алатке команде клика и опције које алатка може да прихвати. Испод је пример команде где покушавамо да преузмемо јпг датотеку слике са УРЛ-а и такође дајемо име и број_нитова.

Сцреенсхот-2025-04-07-155058' loading='lazy' title=пример команде за преузимање јпг

Након што све успешно покренете, моћи ћете да видите своју датотеку (у овом случају фловер.вебп) у директоријуму фолдера као што је приказано испод:

Сцреенсхот-2025-04-07-155750' loading='lazy' title=именик

Коначно смо успешно завршили са тим и ово је један од начина да се направи једноставан вишенитни менаџер преузимања у Питхон-у.