logo

Eenvoudige multithreaded downloadmanager in Python

A Beheerder downloaden is in feite een computerprogramma dat zich toelegt op het downloaden van zelfstandige bestanden van internet. Hier gaan we een eenvoudige Download Manager maken met behulp van threads in Python. Met behulp van multi-threading kan een bestand tegelijkertijd in de vorm van chunks uit verschillende threads worden gedownload. Om dit te implementeren gaan we een eenvoudig opdrachtregelprogramma maken dat de URL van het bestand accepteert en het vervolgens downloadt.

Vereisten: Windows-machine waarop Python is geïnstalleerd.



Installatie

Download de hieronder genoemde pakketten vanaf de opdrachtprompt.

1. Click-pakket: Click is een Python-pakket voor het maken van prachtige opdrachtregelinterfaces met zo weinig code als nodig is. Het is de Command Line Interface Creation Kit.

pip installeren klik



2. Verzoekpakket: In deze tool gaan we een bestand downloaden op basis van de URL (HTTP-adressen). Requests is een HTTP-bibliotheek geschreven in Python waarmee u HTTP-verzoeken kunt verzenden. U kunt headers toevoegen aan meerdelige gegevensbestanden en parameters met eenvoudige Python-woordenboeken en op dezelfde manier toegang krijgen tot de antwoordgegevens.

pip-installatieverzoeken

3. Inrijgpakket: Om met draad te kunnen werken hebben we een inrijgpakket nodig.



mama kulkarni

pip installeren draadsnijden

Uitvoering

Opmerking:

Het programma is in delen opgesplitst, zodat het gemakkelijk te begrijpen is. Zorg ervoor dat u geen enkel deel van de code mist terwijl u het programma uitvoert.

Stap 1: Importeer de vereiste pakketten

Deze pakketten bieden de benodigde tools om webverzoeken opdrachtregelinvoer te laten verwerken en threads te maken.

Python
import click import requests import threading 

Stap 2: Maak de Handler-functie

Elke thread voert deze functie uit om het specifieke deel van het bestand te downloaden. Deze functie is verantwoordelijk voor het opvragen van slechts een specifiek bereik aan bytes en het schrijven ervan naar de juiste positie in het bestand.

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) 

Stap 3: Definieer de hoofdfunctie met klikken

Verandert de functie in een opdrachtregelhulpprogramma. Dit definieert hoe gebruikers vanaf de opdrachtregel met het script omgaan.

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

Stap 4: Stel de bestandsnaam in en bepaal de bestandsgrootte

We hebben de bestandsgrootte nodig om de download over threads te verdelen en ervoor te zorgen dat de server downloads op afstand ondersteunt.

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 

Stap 5: Bestandsruimte vooraf toewijzen

Door vooraf toe te wijzen zorgt u ervoor dat het bestand de juiste grootte heeft voordat we stukjes naar specifieke bytebereiken schrijven.

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

Stap 6: Maak discussies

Aan threads worden specifieke bytebereiken toegewezen die parallel kunnen worden gedownload.

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

Stap 7: Sluit je aan bij discussies

Zorgt ervoor dat alle threads zijn voltooid voordat het programma is voltooid.

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

Code:

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


We zijn klaar met het codeergedeelte en volgen nu de onderstaande opdrachten om het .py-bestand uit te voeren.

python filename.py –-help

Uitgang:

help_uitvoer' title=python bestandsnaam.py –-help


Deze opdracht toont het gebruik van het klikopdrachtgereedschap en de opties die het gereedschap kan accepteren. Hieronder staat de voorbeeldopdracht waarbij we proberen een jpg-afbeeldingsbestand van een URL te downloaden en ook een naam en aantal_van_threads op te geven.

Schermafbeelding-2025-04-07-155058' loading='lazy' title=voorbeeldopdracht om een ​​jpg te downloaden

Nadat alles succesvol is uitgevoerd, kunt u uw bestand (in dit geval flower.webp) in uw mapmap zien, zoals hieronder weergegeven:

Schermafbeelding-2025-04-07-155750' loading='lazy' title=map

Eindelijk zijn we er succesvol mee klaar en dit is een van de manieren om een ​​eenvoudige multithreaded downloadmanager in Python te bouwen.