Yksinkertainen monisäikeinen lataushallinta Pythonissa

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

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_outputpython 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-155058esimerkkikomento jpg-tiedoston lataamiseen

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

Kuvakaappaus-2025-04-07-155750hakemistosta

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