logo

Jednostavan višenitni upravitelj preuzimanja u Pythonu

A Upravitelj preuzimanja je u osnovi računalni program posvećen zadatku preuzimanja samostalnih datoteka s interneta. Ovdje ćemo stvoriti jednostavan Download Manager uz pomoć niti u Pythonu. Korištenjem višenitnosti datoteka se može preuzeti u obliku dijelova istovremeno iz različitih niti. Da bismo to implementirali, izradit ćemo jednostavan alat naredbenog retka koji prihvaća URL datoteke i zatim je preuzima.

Preduvjeti: Windows stroj s instaliranim Pythonom.



Postavljanje

Preuzmite dolje navedene pakete iz naredbenog retka.

1. Click paket: Click je Python paket za stvaranje prekrasnih sučelja naredbenog retka sa što manje koda koliko je potrebno. To je Command Line Interface Creation Kit.

pip instalirati klik



2. Paket zahtjeva: u ovom alatu ćemo preuzeti datoteku na temelju URL-a (HTTP adrese). Zahtjevi su HTTP biblioteka napisana u Pythonu koja vam omogućuje slanje HTTP zahtjeva. Možete dodati zaglavlja iz višedijelnih datoteka podataka i parametara s jednostavnim Python rječnicima i pristupiti podacima odgovora na isti način.

pip instalacijski zahtjevi

3. Threading paket: Za rad s nitima potreban nam je Threading paket.



pip instalacija niti

Provedba

program prostih brojeva u Javi

Bilješka:

Program je podijeljen u dijelove radi lakšeg razumijevanja. Provjerite da vam ne nedostaje nijedan dio koda tijekom pokretanja programa.

Korak 1: Uvezite potrebne pakete

Ovi paketi pružaju potrebne alate kako bi web zahtjevi mogli rukovati unosima naredbenog retka i stvarati niti.

Python
import click import requests import threading 

Korak 2: Stvorite funkciju rukovatelja

Svaka nit će izvršiti ovu funkciju za preuzimanje svog specifičnog dijela datoteke. Ova je funkcija odgovorna za traženje samo određenog raspona bajtova i njihovo zapisivanje na ispravnu poziciju u datoteci.

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) 

Korak 3: Definirajte glavnu funkciju klikom

Pretvara funkciju u uslužni program naredbenog retka. Ovo definira kako korisnici komuniciraju sa skriptom iz naredbenog retka.

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

Korak 4: Postavite naziv datoteke i odredite veličinu datoteke

Potrebna nam je veličina datoteke kako bismo podijelili preuzimanje među nitima i osigurali da poslužitelj podržava različita preuzimanja.

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 

Korak 5: Prethodno dodijelite prostor za datoteke

Prethodno dodjeljivanje osigurava da je datoteka ispravne veličine prije nego što zapišemo dijelove u određene raspone bajtova.

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

Korak 6: Stvorite niti

Niti se dodjeljuju određeni rasponi bajtova za paralelno preuzimanje.

java zamijeni sav niz
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() 

Korak 7: Pridružite se nitima

Osigurava da su sve niti dovršene prije završetka programa.

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

Kodirati:

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


Završili smo s dijelom kodiranja i sada slijedite naredbe prikazane u nastavku za pokretanje .py datoteke.

python filename.py –-help

Izlaz:

pomoć_izlaz' title=python naziv datoteke.py –-pomoć


Ova naredba prikazuje upotrebu alata za naredbu klika i opcije koje alat može prihvatiti. Ispod je primjer naredbe gdje pokušavamo preuzeti jpg slikovnu datoteku s URL-a i također dajemo naziv i broj_niti.

Snimka zaslona-2025-04-07-155058' loading='lazy' title=primjer naredbe za preuzimanje jpg

Nakon što sve uspješno pokrenete, moći ćete vidjeti svoju datoteku (flower.webp u ovom slučaju) u direktoriju svoje mape kao što je prikazano u nastavku:

Snimka zaslona-2025-04-07-155750' loading='lazy' title=imenik

Napokon smo uspješno završili s tim i ovo je jedan od načina za izgradnju jednostavnog višenitnog upravitelja preuzimanja u Pythonu.