logo

Jednoduchý multivláknový správca sťahovania v Pythone

A Správca sťahovania je v podstate počítačový program určený na sťahovanie samostatných súborov z internetu. Tu vytvoríme jednoduchý Download Manager s pomocou vlákien v Pythone. Pomocou multi-threadingu je možné stiahnuť súbor vo forme kúskov súčasne z rôznych vlákien. Aby sme to implementovali, vytvoríme jednoduchý nástroj príkazového riadka, ktorý akceptuje webovú adresu súboru a potom ho stiahne.

Predpoklady: Počítač so systémom Windows s nainštalovaným Pythonom.



Nastavenie

Stiahnite si nižšie uvedené balíčky z príkazového riadka.

1. Click package: Click je balík Pythonu na vytváranie krásnych rozhraní príkazového riadka s čo najmenším množstvom kódu. Je to súprava na vytváranie rozhrania príkazového riadka.

kliknite na inštaláciu pip



2. Balíček požiadaviek: V tomto nástroji stiahneme súbor na základe URL (adresy HTTP). Requests je HTTP knižnica napísaná v Pythone, ktorá vám umožňuje posielať HTTP požiadavky. Pomocou jednoduchých slovníkov Pythonu môžete pridávať hlavičky z dátových súborov a parametrov s viacerými časťami a pristupovať k údajom odpovedí rovnakým spôsobom.

požiadavky na inštaláciu pip

3. Závitovací balík: Na prácu s vláknami potrebujeme závitový balík.



skontrolujte verziu java na linuxe

závit na inštaláciu pipu

Implementácia

význam xd

Poznámka:

Program je rozdelený na časti, aby bol zrozumiteľný. Uistite sa, že vám pri spustení programu nechýba žiadna časť kódu.

Krok 1: Importujte požadované balíky

Tieto balíky poskytujú potrebné nástroje na to, aby webové požiadavky spracovávali vstupy z príkazového riadka a vytvárali vlákna.

Python
import click import requests import threading 

Krok 2: Vytvorte funkciu Handler

Každé vlákno vykoná túto funkciu na stiahnutie svojej konkrétnej časti súboru. Táto funkcia je zodpovedná za vyžiadanie len určitého rozsahu bajtov a ich zapísanie na správnu pozíciu v súbore.

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) 

Krok 3: Definujte hlavnú funkciu kliknutím

Zmení funkciu na nástroj príkazového riadka. Toto definuje, ako používatelia interagujú so skriptom z príkazového riadku.

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

Krok 4: Nastavte názov súboru a určite veľkosť súboru

Potrebujeme veľkosť súboru, aby sme sťahovanie rozdelili medzi vlákna a zabezpečili, že server podporuje sťahovanie v rozsahu.

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 

Krok 5: Predbežne prideľte priestor súboru

Predbežné pridelenie zaisťuje, že súbor má správnu veľkosť predtým, ako zapíšeme časti do konkrétnych rozsahov bajtov.

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

Krok 6: Vytvorte vlákna

Vláknam sú priradené špecifické rozsahy bajtov, ktoré sa majú sťahovať paralelne.

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

Krok 7: Pripojte vlákna

Zabezpečuje dokončenie všetkých vlákien pred dokončením programu.

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

kód:

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


Skončili sme s kódovaním a teraz postupujte podľa nižšie uvedených príkazov na spustenie súboru .py.

numpy log
python filename.py –-help

výstup:

help_output' title=python filename.py –-help


Tento príkaz zobrazuje použitie nástroja príkazu na kliknutie a možnosti, ktoré tento nástroj môže akceptovať. Nižšie je uvedený vzorový príkaz, v ktorom sa pokúšame stiahnuť súbor s obrázkom jpg z adresy URL a tiež sme zadali názov a počet vlákien.

Snímka obrazovky-2025-04-07-155058' loading='lazy' title=ukážkový príkaz na stiahnutie jpg

Po úspešnom spustení všetkého budete môcť vidieť svoj súbor (v tomto prípade flower.webp) v adresári priečinka, ako je uvedené nižšie:

Snímka obrazovky-2025-04-07-155750' loading='lazy' title=adresár

Nakoniec sme s tým úspešne skončili a toto je jeden zo spôsobov, ako vytvoriť jednoduchého viacvláknového správcu sťahovania v Pythone.