logo

Egyszerű többszálú letöltéskezelő a Pythonban

A Letöltéskezelő alapvetően egy számítógépes program, amely önálló fájlok internetről történő letöltésére szolgál. Itt egy egyszerű Letöltéskezelőt fogunk létrehozni a Python szálai segítségével. A többszálú fájlok egyidejűleg darabok formájában tölthetők le különböző szálakból. Ennek megvalósításához egy egyszerű parancssori eszközt fogunk létrehozni, amely elfogadja a fájl URL-jét, majd letölti azt.

Előfeltételek: Windows gép Python telepítve.



Beállítás

Töltse le az alábbi csomagokat a parancssorból.

1. Click-csomag: A Click egy Python-csomag gyönyörű parancssori felületek létrehozására a szükséges számú kóddal. Ez a Command Line Interface Creation Kit.

pip telepítés kattintás



gépirat kapcsoló

2. Kérelemcsomag: Ebben az eszközben az URL-en (HTTP-címeken) alapuló fájlt fogunk letölteni. A Requests egy Pythonban írt HTTP-könyvtár, amely lehetővé teszi HTTP-kérések küldését. Egyszerű Python-szótárak segítségével fejléceket adhat hozzá több részből álló adatfájlokhoz és paraméterekhez, és ugyanúgy hozzáférhet a válaszadatokhoz.

pip telepítési kérések

3. Menetfűző csomag: A szálakkal való munkához menetfűző csomagra van szükségünk.



internetböngésző beállításai

pip install menetfűzés

Végrehajtás

Jegyzet:

A program részekre van osztva, hogy könnyebben érthető legyen. Győződjön meg arról, hogy a program futtatása közben a kód egyetlen része sem hiányzik.

1. lépés: Importálja a szükséges csomagokat

Ezek a csomagok biztosítják a szükséges eszközöket ahhoz, hogy a webes kérések kezeljék a parancssori bemeneteket és szálakat hozzanak létre.

Python
import click import requests import threading 

2. lépés: Hozza létre a kezelő függvényt

Minden szál végrehajtja ezt a funkciót a fájl saját részének letöltéséhez. Ez a funkció felelős azért, hogy csak egy meghatározott bájttartományt kérjen le és írja be a fájl megfelelő pozíciójába.

sor vs oszlop
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) 

3. lépés: Határozza meg a fő funkciót kattintással

A függvényt parancssori segédprogrammá alakítja. Ez határozza meg, hogy a felhasználók hogyan lépnek kapcsolatba a parancssorral a parancssorból.

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

4. lépés: Állítsa be a fájlnevet és a fájlméretet

Szükségünk van a fájl méretére, hogy a letöltést a szálak között feloszthassuk, és biztosítsuk, hogy a szerver támogassa a tartományos letöltéseket.

gépírás dátuma
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 

5. lépés: Fájlterület előfoglalása

Az előfoglalás biztosítja, hogy a fájl megfelelő méretű legyen, mielőtt darabokat írnánk meghatározott bájttartományokba.

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

6. lépés: Hozzon létre szálakat

A szálakhoz meghatározott bájttartományok vannak hozzárendelve a párhuzamos letöltéshez.

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

7. lépés: Csatlakozzon a szálakhoz

Biztosítja, hogy az összes szál befejeződjön a program befejezése előtt.

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


Elkészültünk a kódolási résszel, és most kövesse az alábbi parancsokat a .py fájl futtatásához.

Linux futtatni cmd
python filename.py –-help

Kimenet:

help_output' title=python fájlnév.py –-help


Ez a parancs megmutatja a kattintási parancs eszköz használatát és az eszköz által elfogadott beállításokat. Alább látható a példaparancs, ahol megpróbálunk letölteni egy jpg képfájlt egy URL-ről, és megadtuk a nevet és a szálak_számát is.

Képernyőkép-2025-04-07-155058' loading='lazy' title=minta parancs egy jpg letöltéséhez

Miután minden sikeresen lefutott, láthatja a fájlt (ebben az esetben a flower.webp) a mappa könyvtárában, az alábbiak szerint:

Képernyőkép-2025-04-07-155750' loading='lazy' title=könyvtárat

Végül sikeresen elkészültünk vele, és ez az egyik módja annak, hogy egy egyszerű többszálas letöltéskezelőt építsünk Pythonban.