Jednoduchý multivláknový správca sťahovania v Pythone

Jednoduchý multivláknový správca sťahovania v Pythone

A Správca sťahovania je v podstate počítačový program určený na sťahovanie samostatných súborov z internetu. Tu vytvoríme jednoduchý Download Manager s pomocou vlákien v Pythone. Pomocou multi-threadingu je možné stiahnuť súbor vo forme kúskov súčasne z rôznych vlákien. Aby sme to implementovali, vytvoríme jednoduchý nástroj príkazového riadka, ktorý akceptuje webovú adresu súboru a potom ho stiahne.

Predpoklady: Počítač so systémom Windows s nainštalovaným Pythonom.

Nastavenie

Stiahnite si nižšie uvedené balíčky z príkazového riadka.

1. Click package: Click je balík Pythonu na vytváranie krásnych rozhraní príkazového riadka s čo najmenším množstvom kódu. Je to súprava na vytváranie rozhrania príkazového riadka.

kliknite na inštaláciu pip

2. Balíček požiadaviek: V tomto nástroji stiahneme súbor na základe URL (adresy HTTP). Requests je HTTP knižnica napísaná v Pythone, ktorá vám umožňuje posielať HTTP požiadavky. Pomocou jednoduchých slovníkov Pythonu môžete pridávať hlavičky z dátových súborov a parametrov s viacerými časťami a pristupovať k údajom odpovedí rovnakým spôsobom.

požiadavky na inštaláciu pip

3. Závitovací balík: Na prácu s vláknami potrebujeme závitový balík.

závit na inštaláciu pipu

Implementácia

Poznámka:

Program je rozdelený na časti, aby bol zrozumiteľný. Uistite sa, že vám pri spustení programu nechýba žiadna časť kódu.

Krok 1: Importujte požadované balíky

Tieto balíky poskytujú potrebné nástroje na to, aby webové požiadavky spracovávali vstupy z príkazového riadka a vytvárali vlákna.

Python
   import   click   import   requests   import   threading   

Krok 2: Vytvorte funkciu Handler

Každé vlákno vykoná túto funkciu na stiahnutie svojej konkrétnej časti súboru. Táto funkcia je zodpovedná za vyžiadanie len určitého rozsahu bajtov a ich zapísanie na správnu pozíciu v súbore.

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  )   

Krok 3: Definujte hlavnú funkciu kliknutím

Zmení funkciu na nástroj príkazového riadka. Toto definuje, ako používatelia interagujú so skriptom z príkazového riadku.

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

Krok 4: Nastavte názov súboru a určite veľkosť súboru

Potrebujeme veľkosť súboru, aby sme sťahovanie rozdelili medzi vlákna a zabezpečili, že server podporuje sťahovanie v rozsahu.

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   

Krok 5: Predbežne prideľte priestor súboru

Predbežné pridelenie zaisťuje, že súbor má správnu veľkosť predtým, ako zapíšeme časti do konkrétnych rozsahov bajtov.

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

Krok 6: Vytvorte vlákna

Vláknam sú priradené špecifické rozsahy bajtov, ktoré sa majú sťahovať paralelne.

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

Krok 7: Pripojte vlákna

Zabezpečuje dokončenie všetkých vlákien pred dokončením programu.

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


Skončili sme s kódovaním a teraz postupujte podľa nižšie uvedených príkazov na spustenie súboru .py.

 python filename.py –-help  

výstup:

help_outputpython filename.py –-help


Tento príkaz zobrazuje použitie nástroja príkazu na kliknutie a možnosti, ktoré tento nástroj môže akceptovať. Nižšie je uvedený vzorový príkaz, v ktorom sa pokúšame stiahnuť súbor s obrázkom jpg z adresy URL a tiež sme zadali názov a počet vlákien.

Snímka obrazovky-2025-04-07-155058ukážkový príkaz na stiahnutie jpg

Po úspešnom spustení všetkého budete môcť vidieť svoj súbor (v tomto prípade flower.webp) v adresári priečinka, ako je uvedené nižšie:

Snímka obrazovky-2025-04-07-155750adresár

Nakoniec sme s tým úspešne skončili a toto je jeden zo spôsobov, ako vytvoriť jednoduchého viacvláknového správcu sťahovania v Pythone.