Једноставан вишенитни менаџер преузимања у Питхон-у

Једноставан вишенитни менаџер преузимања у Питхон-у

А Довнлоад Манагер је у основи рачунарски програм посвећен задатку преузимања самосталних датотека са интернета. Овде ћемо направити једноставан Менаџер преузимања уз помоћ нити у Питхон-у. Коришћењем вишенитног рада датотека се може преузети у облику комада истовремено из различитих нити. Да бисмо ово применили, направићемо једноставну алатку командне линије која прихвата УРЛ датотеке и затим је преузима.

Предуслови: Виндовс машина са инсталираним Питхон-ом.

Сетуп

Преузмите доле наведене пакете из командне линије.

1. Кликните пакет: Цлицк је Питхон пакет за креирање прелепих интерфејса командне линије са што мање кода колико је потребно. То је комплет за креирање интерфејса командне линије.

пип инсталл кликните

2. Захтеви пакет: У овом алату ћемо преузети датотеку на основу УРЛ-а (ХТТП адресе). Захтеви су ХТТП библиотека написана у Питхон-у која вам омогућава да шаљете ХТТП захтеве. Можете додати заглавља у вишеделне датотеке и параметре са подацима са једноставним Питхон речницима и приступити подацима одговора на исти начин.

захтеви за инсталацију пип-а

3. Тхреадинг пакет: За рад са нитима потребан нам је тхреадинг пакет.

пип инсталл тхреадинг

Имплементација

Напомена:

Програм је подељен на делове да би се лакше разумео. Уверите се да вам не недостаје ниједан део кода док покрећете програм.

Корак 1: Увезите потребне пакете

Ови пакети обезбеђују неопходне алате да би веб захтеви руковали уносима командне линије и креирали нити.

Python
   import   click   import   requests   import   threading   

Корак 2: Креирајте функцију руковаоца

Свака нит ће извршити ову функцију да преузме свој одређени део датотеке. Ова функција је одговорна за тражење само одређеног опсега бајтова и њихово уписивање на исправну позицију у датотеци.

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: Дефинишите главну функцију кликом

Претвара функцију у услужни програм командне линије. Ово дефинише начин на који корисници комуницирају са скриптом из командне линије.

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: Подесите име датотеке и одредите величину датотеке

Потребна нам је величина датотеке да бисмо поделили преузимање између нити и осигурали да сервер подржава преузимање у опсегу.

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: Унапред додијелите простор датотеке

Претходно додељивање обезбеђује да је датотека исправне величине пре него што запишемо делове у одређене опсеге бајтова.

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

Корак 6: Креирајте нити

Нитима се додељују одређени распони бајтова за паралелно преузимање.

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: Придружите се нитима

Осигурава да су све нити завршене пре него што се програм заврши.

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

код:

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


Завршили смо са делом кодирања и сада следите команде приказане у наставку да бисте покренули .пи датотеку.

 python filename.py –-help  

Излаз:

хелп_оутпутпитхон филенаме.пи –-хелп


Ова команда приказује употребу алатке команде клика и опције које алатка може да прихвати. Испод је пример команде где покушавамо да преузмемо јпг датотеку слике са УРЛ-а и такође дајемо име и број_нитова.

Сцреенсхот-2025-04-07-155058пример команде за преузимање јпг

Након што све успешно покренете, моћи ћете да видите своју датотеку (у овом случају фловер.вебп) у директоријуму фолдера као што је приказано испод:

Сцреенсхот-2025-04-07-155750именик

Коначно смо успешно завршили са тим и ово је један од начина да се направи једноставан вишенитни менаџер преузимања у Питхон-у.