logo

Simpel Multithreaded Download Manager i Python

EN Download Manager er dybest set et computerprogram dedikeret til opgaven med at downloade enkeltstående filer fra internettet. Her skal vi lave en simpel Download Manager ved hjælp af tråde i Python. Ved at bruge multi-threading kan en fil downloades i form af bidder samtidigt fra forskellige tråde. For at implementere dette skal vi oprette et simpelt kommandolinjeværktøj, som accepterer webadressen til filen og derefter downloader den.

attribut fejl python

Forudsætninger: Windows-maskine med Python installeret.



Opsætning

Download nedenstående pakker fra kommandoprompten.

1. Klikpakke: Click er en Python-pakke til at skabe smukke kommandolinjegrænseflader med så lidt kode som nødvendigt. Det er Command Line Interface Creation Kit.

pip installation klik



2. Anmodningspakke: I dette værktøj skal vi downloade en fil baseret på URL'en (HTTP-adresser). Requests er et HTTP-bibliotek skrevet i Python, som giver dig mulighed for at sende HTTP-anmodninger. Du kan tilføje overskrifter fra datafiler og parametre i flere dele med simple Python-ordbøger og få adgang til svardataene på samme måde.

pip installationsanmodninger

3. Gevindpakke: For at arbejde med tråde har vi brug for gevindpakke.



pip installer gevind

konverter streng til int java

Implementering

Note:

Programmet er opdelt i dele for at gøre det let at forstå. Sørg for, at du ikke mangler nogen del af koden, mens du kører programmet.

Trin 1: Importer nødvendige pakker

Disse pakker giver de nødvendige værktøjer til at få webanmodninger til at håndtere kommandolinje-input og oprette tråde.

flyde til snor
Python
import click import requests import threading 

Trin 2: Opret Handler-funktionen

Hver tråd vil udføre denne funktion for at downloade sin specifikke del af filen. Denne funktion er ansvarlig for kun at anmode om et specifikt udvalg af bytes og skrive dem til den korrekte position i filen.

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) 

Trin 3: Definer hovedfunktionen med klik

Gør funktionen til et kommandolinjeværktøj. Dette definerer, hvordan brugere interagerer med scriptet fra kommandolinjen.

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

Trin 4: Indstil filnavn og bestem filstørrelse

Vi har brug for filstørrelsen for at opdele overførslen mellem tråde og sikre, at serveren understøtter overførsler med rækkevidde.

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 

Trin 5: Forallok filplads

Forallokering sikrer, at filen har den korrekte størrelse, før vi skriver chunks til specifikke byteområder.

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

Trin 6: Opret tråde

Tråde er tildelt specifikke byte-intervaller, der skal downloades parallelt.

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

Trin 7: Deltag i tråde

Sikrer at alle tråde er færdige, før programmet afsluttes.

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

Kode:

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


Vi er færdige med kodningsdelen og følg nu kommandoerne vist nedenfor for at køre .py-filen.

udvælgelsessortering
python filename.py –-help

Produktion:

help_output' title=python filnavn.py –-hjælp


Denne kommando viser brugen af ​​klikkommandoværktøjet og muligheder, som værktøjet kan acceptere. Nedenfor er prøvekommandoen, hvor vi forsøger at downloade en jpg-billedfil fra en URL og også gav et navn og antal_tråde.

Skærmbillede-2025-04-07-155058' loading='lazy' title=eksempelkommando for at downloade en jpg

Når alt har kørt alt med succes, vil du være i stand til at se din fil (flower.webp i dette tilfælde) i din mappemappe som vist nedenfor:

Skærmbillede-2025-04-07-155750' loading='lazy' title=vejviser

Endelig er vi med succes færdige med det, og dette er en af ​​vejene til at bygge en simpel multithreaded download-manager i Python.