Enkel Multithreaded Download Manager i Python

Enkel Multithreaded Download Manager i Python

EN Nedlastingsbehandler er i utgangspunktet et dataprogram dedikert til oppgaven med å laste ned frittstående filer fra internett. Her skal vi lage en enkel nedlastingsbehandling ved hjelp av tråder i Python. Ved å bruke multi-threading kan en fil lastes ned i form av biter samtidig fra forskjellige tråder. For å implementere dette skal vi lage et enkelt kommandolinjeverktøy som godtar nettadressen til filen og deretter laster den ned.

Forutsetninger: Windows-maskin med Python installert.

Oppsett

Last ned pakkene nedenfor fra ledeteksten.

1. Klikkpakke: Klikk er en Python-pakke for å lage vakre kommandolinjegrensesnitt med så lite kode som nødvendig. Det er Command Line Interface Creation Kit.

pip installer klikk

2. Forespørselspakke: I dette verktøyet skal vi laste ned en fil basert på URL (HTTP-adresser). Requests er et HTTP-bibliotek skrevet i Python som lar deg sende HTTP-forespørsler. Du kan legge til overskrifter fra flerdelte datafiler og parametere med enkle Python-ordbøker og få tilgang til svardataene på samme måte.

pip-installasjonsforespørsler

3. Trådpakke: For å jobbe med tråder trenger vi trådpakke.

pip installer gjenger

Implementering

Note:

Programmet er delt opp i deler for å gjøre det enkelt å forstå. Pass på at du ikke mangler noen del av koden mens du kjører programmet.

Trinn 1: Importer nødvendige pakker

Disse pakkene gir de nødvendige verktøyene for å få nettforespørsler til å håndtere kommandolinjeinndata og lage tråder.

Python
   import   click   import   requests   import   threading   

Trinn 2: Opprett behandlerfunksjonen

Hver tråd vil utføre denne funksjonen for å laste ned sin spesifikke del av filen. Denne funksjonen er ansvarlig for kun å be om et spesifikt utvalg av byte og skrive dem til riktig posisjon i filen.

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  )   

Trinn 3: Definer hovedfunksjonen med klikk

Gjør funksjonen til et kommandolinjeverktøy. Dette definerer hvordan brukere samhandler med skriptet fra kommandolinjen.

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

Trinn 4: Angi filnavn og bestem filstørrelse

Vi trenger filstørrelsen for å dele nedlastingen mellom tråder og sikre at serveren støtter varierte nedlastinger.

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   

Trinn 5: Forhåndstildel filplass

Forhåndstildeling sikrer at filen har riktig størrelse før vi skriver biter til bestemte byteområder.

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

Trinn 6: Lag tråder

Tråder er tildelt spesifikke byteområder som skal lastes ned parallelt.

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

Trinn 7: Bli med i tråder

Sørger for at alle tråder er fullført før programmet avsluttes.

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

Kode:

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


Vi er ferdige med kodingsdelen og følger nå kommandoene vist nedenfor for å kjøre .py-filen.

 python filename.py –-help  

Produksjon:

help_outputpython filnavn.py –-hjelp


Denne kommandoen viser bruken av klikkkommandoverktøyet og alternativer som verktøyet kan godta. Nedenfor er eksempelkommandoen hvor vi prøver å laste ned en jpg-bildefil fra en URL og også ga et navn og antall_tråder.

Skjermbilde-2025-04-07-155058eksempelkommando for å laste ned en jpg

Etter at alt har kjørt alt vellykket, vil du kunne se filen (flower.webp i dette tilfellet) i mappekatalogen din som vist nedenfor:

Skjermbilde-2025-04-07-155750katalog

Endelig er vi ferdig med det, og dette er en av måtene å bygge en enkel multithreaded nedlastingsbehandler i Python.