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

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

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.

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.

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.

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.

 python filename.py –-help  

Kimenet:

help_outputpython 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-155058minta 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-155750kö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.