logo

Yksinkertainen monisäikeinen lataushallinta Pythonissa

A Download Manager on pohjimmiltaan tietokoneohjelma, joka on omistettu itsenäisten tiedostojen lataamiseen Internetistä. Täällä aiomme luoda yksinkertaisen lataushallinnan Pythonin säikeiden avulla. Monisäikeisyyden avulla tiedosto voidaan ladata paloina samanaikaisesti eri säikeistä. Tämän toteuttamiseksi luomme yksinkertaisen komentorivityökalun, joka hyväksyy tiedoston URL-osoitteen ja lataa sen sitten.

Edellytykset: Windows-kone, jossa Python asennettuna.



Asennus

Lataa alla mainitut paketit komentokehotteesta.

1. Click-paketti: Click on Python-paketti kauniiden komentoriviliittymien luomiseen niin pienellä koodilla kuin tarpeen. Se on Command Line Interface Creation Kit.

pip asennus napsauta



voi abstraktilla luokalla olla rakentaja

2. Pyyntöpaketti: Tällä työkalulla aiomme ladata tiedoston URL-osoitteen (HTTP-osoitteiden) perusteella. Requests on Pythonilla kirjoitettu HTTP-kirjasto, jonka avulla voit lähettää HTTP-pyyntöjä. Voit lisätä otsikoita moniosaisiin tietotiedostoihin ja parametreihin yksinkertaisilla Python-sanakirjoilla ja käyttää vastaustietoja samalla tavalla.

pip-asennuspyynnöt

3. Pujotuspaketti: Tarvitsemme lankojen kanssa työskentelyyn langoituspaketin.



pip asennus kierteitys

Toteutus

Huomautus:

Ohjelma on jaettu osiin, jotta se olisi helppo ymmärtää. Varmista, että et menetä mitään koodin osaa ohjelman suorittamisen aikana.

Vaihe 1: Tuo vaaditut paketit

Nämä paketit tarjoavat tarvittavat työkalut, joiden avulla verkkopyynnöt voivat käsitellä komentorivisyöttöjä ja luoda säikeitä.

Python
import click import requests import threading 

Vaihe 2: Luo Käsittelijäfunktio

Jokainen säiettä suorittaa tämän toiminnon ladatakseen tietyn osan tiedostosta. Tämä toiminto vastaa vain tietyn tavualueen pyytämisestä ja kirjoittamisesta oikeaan paikkaan tiedostossa.

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) 

Vaihe 3: Määritä päätoiminto napsauttamalla

Muuttaa toiminnon komentorivityökaluksi. Tämä määrittää, kuinka käyttäjät ovat vuorovaikutuksessa komentosarjan kanssa komentoriviltä.

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

Vaihe 4: Aseta tiedostonimi ja määritä tiedostokoko

Tarvitsemme tiedostokoon jakaaksemme latauksen säikeiden kesken ja varmistaaksemme, että palvelin tukee vaihtelevia latauksia.

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 

Vaihe 5: Varaa etukäteen tiedostotila

Esivaraus varmistaa, että tiedosto on oikean kokoinen, ennen kuin kirjoitamme paloja tietyille tavualueille.

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

Vaihe 6: Luo säikeitä

Säikeille on määritetty tietyt tavualueet ladattavaksi rinnakkain.

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

Vaihe 7: Liity säikeisiin

Varmistaa, että kaikki säikeet ovat valmiit ennen ohjelman päättymistä.

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

Koodi:

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


Koodausosa on valmis ja suorita .py-tiedosto seuraamalla alla olevia komentoja.

python filename.py –-help

Lähtö:

help_output' title=python filename.py –-help


Tämä komento näyttää napsautuskomentotyökalun käytön ja työkalun hyväksymät vaihtoehdot. Alla on esimerkkikomento, jossa yritämme ladata jpg-kuvatiedoston URL-osoitteesta ja annamme myös nimen ja säikeiden_määrän.

Kuvakaappaus-2025-04-07-155058' loading='lazy' title=esimerkkikomento jpg-tiedoston lataamiseen

Kun kaikki on suoritettu onnistuneesti, voit nähdä tiedostosi (tässä tapauksessa flower.webp) kansiohakemistossasi alla olevan kuvan mukaisesti:

"abc" on numeroissa
Kuvakaappaus-2025-04-07-155750' loading='lazy' title=hakemistosta

Viimeinkin olemme onnistuneet sen kanssa, ja tämä on yksi tapa rakentaa yksinkertainen monisäikeinen lataushallinta Pythonissa.