logo

Enkel Multithreaded Download Manager i Python

EN Nedlastingsbehandler er i utgangspunktet et dataprogram dedikert til oppgaven med å laste ned frittstående filer fra internett. Her skal vi lage en enkel nedlastingsbehandling ved hjelp av tråder i Python. Ved å bruke multi-threading kan en fil lastes ned i form av biter samtidig fra forskjellige tråder. For å implementere dette skal vi lage et enkelt kommandolinjeverktøy som godtar nettadressen til filen og deretter laster den ned.

filmskuespiller Kajal

Forutsetninger: Windows-maskin med Python installert.



Oppsett

Last ned pakkene nedenfor fra ledeteksten.

1. Klikkpakke: Klikk er en Python-pakke for å lage vakre kommandolinjegrensesnitt med så lite kode som nødvendig. Det er Command Line Interface Creation Kit.

pip installer klikk



2. Forespørselspakke: I dette verktøyet skal vi laste ned en fil basert på URL (HTTP-adresser). Requests er et HTTP-bibliotek skrevet i Python som lar deg sende HTTP-forespørsler. Du kan legge til overskrifter fra flerdelte datafiler og parametere med enkle Python-ordbøker og få tilgang til svardataene på samme måte.

pip-installasjonsforespørsler

3. Trådpakke: For å jobbe med tråder trenger vi trådpakke.



pip installer gjenger

konverter streng til int java

Implementering

Note:

Programmet er delt opp i deler for å gjøre det enkelt å forstå. Pass på at du ikke mangler noen del av koden mens du kjører programmet.

Trinn 1: Importer nødvendige pakker

Disse pakkene gir de nødvendige verktøyene for å få nettforespørsler til å håndtere kommandolinjeinndata og lage tråder.

gi nytt navn til en katalog
Python
import click import requests import threading 

Trinn 2: Opprett behandlerfunksjonen

Hver tråd vil utføre denne funksjonen for å laste ned sin spesifikke del av filen. Denne funksjonen er ansvarlig for kun å be om et spesifikt utvalg av byte og skrive dem til riktig posisjon 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) 

Trinn 3: Definer hovedfunksjonen med klikk

Gjør funksjonen til et kommandolinjeverktøy. Dette definerer hvordan brukere samhandler med skriptet 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): 

Trinn 4: Angi filnavn og bestem filstørrelse

Vi trenger filstørrelsen for å dele nedlastingen mellom tråder og sikre at serveren støtter varierte nedlastinger.

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 

Trinn 5: Forhåndstildel filplass

Forhåndstildeling sikrer at filen har riktig størrelse før vi skriver biter til bestemte byteområder.

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

Trinn 6: Lag tråder

Tråder er tildelt spesifikke byteområder som skal lastes ned 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() 

Trinn 7: Bli med i tråder

Sørger for at alle tråder er fullført før programmet avsluttes.

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 ferdige med kodingsdelen og følger nå kommandoene vist nedenfor for å kjøre .py-filen.

10 til makten 6
python filename.py –-help

Produksjon:

help_output' title=python filnavn.py –-hjelp


Denne kommandoen viser bruken av klikkkommandoverktøyet og alternativer som verktøyet kan godta. Nedenfor er eksempelkommandoen hvor vi prøver å laste ned en jpg-bildefil fra en URL og også ga et navn og antall_tråder.

Skjermbilde-2025-04-07-155058' loading='lazy' title=eksempelkommando for å laste ned en jpg

Etter at alt har kjørt alt vellykket, vil du kunne se filen (flower.webp i dette tilfellet) i mappekatalogen din som vist nedenfor:

Skjermbilde-2025-04-07-155750' loading='lazy' title=katalog

Endelig er vi ferdig med det, og dette er en av måtene å bygge en enkel multithreaded nedlastingsbehandler i Python.