logo

Manager de descărcare simplu cu mai multe fire în Python

O Manager de descărcare este practic un program de calculator dedicat sarcinii de a descărca fișiere independente de pe internet. Aici vom crea un Manager de descărcări simplu cu ajutorul thread-urilor în Python. Folosind multi-threading, un fișier poate fi descărcat sub formă de bucăți simultan din fire diferite. Pentru a implementa acest lucru, vom crea un instrument simplu de linie de comandă care acceptă URL-ul fișierului și apoi îl descarcă.

Cerințe preliminare: mașină Windows cu Python instalat.



java și swing

Înființat

Descărcați pachetele menționate mai jos din promptul de comandă.

1. Pachetul Click: Click este un pachet Python pentru a crea interfețe frumoase de linie de comandă cu cât de puțin cod este necesar. Este kit-ul de creare a interfeței liniei de comandă.

faceți clic pe pip install



2. Pachetul de solicitări: În acest instrument vom descărca un fișier bazat pe URL (adresele HTTP). Requests este o bibliotecă HTTP scrisă în Python care vă permite să trimiteți solicitări HTTP. Puteți adăuga anteturi din fișiere cu mai multe părți și parametri cu dicționare Python simple și puteți accesa datele de răspuns în același mod.

solicitări de instalare pip

3. Pachetul de threading: Pentru a lucra cu fire avem nevoie de pachet de threading.



filetare pip install

Implementarea

Nota:

Programul a fost împărțit în părți pentru a fi ușor de înțeles. Asigurați-vă că nu pierdeți nicio parte a codului în timp ce rulați programul.

Pasul 1: importați pachetele necesare

Aceste pachete oferă instrumentele necesare pentru ca cererile web să gestioneze intrările din linia de comandă și să creeze fire de execuție.

123film
Python
import click import requests import threading 

Pasul 2: Creați funcția de gestionare

Fiecare fir de execuție va executa această funcție pentru a descărca partea sa specifică a fișierului. Această funcție este responsabilă pentru solicitarea doar a unui anumit interval de octeți și scrierea lor în poziția corectă în fișier.

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) 

Pasul 3: Definiți funcția principală cu Click

Transformă funcția într-un utilitar de linie de comandă. Aceasta definește modul în care utilizatorii interacționează cu scriptul din linia de comandă.

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

Pasul 4: Setați numele fișierului și determinați dimensiunea fișierului

Avem nevoie de dimensiunea fișierului pentru a împărți descărcarea între fire și pentru a ne asigura că serverul acceptă descărcări variate.

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 

Pasul 5: Prealocați spațiu pentru fișiere

Prealocarea asigură că fișierul are dimensiunea corectă înainte de a scrie bucăți în anumite intervale de octeți.

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

Pasul 6: Creați fire

Firelor li se atribuie intervale de octeți specifice pentru a fi descărcate în paralel.

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

Pasul 7: alăturați-vă firelor

Se asigură că toate firele sunt finalizate înainte ca programul să se termine.

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

Cod:

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


Am terminat cu partea de codificare și acum urmați comenzile afișate mai jos pentru a rula fișierul .py.

boto3
python filename.py –-help

Ieșire:

help_output' title=python filename.py –-help


Această comandă arată utilizarea instrumentului de comandă clic și opțiunile pe care instrumentul le poate accepta. Mai jos este exemplul de comandă în care încercăm să descarcăm un fișier imagine jpg de la o adresă URL și, de asemenea, am dat un nume și un număr_de_fire.

Captură de ecran-2025-04-07-155058' loading='lazy' title=exemplu de comandă pentru a descărca un jpg

La urma urmei, rulați totul cu succes, veți putea vedea fișierul (flower.webp în acest caz) în directorul folderului, așa cum se arată mai jos:

Captură de ecran-2025-04-07-155750' loading='lazy' title=director

În cele din urmă, am terminat cu succes și acesta este unul dintre modalitățile de a construi un manager simplu de descărcare multithreaded în Python.