Простий багатопоточний менеджер завантажень на Python

Простий багатопоточний менеджер завантажень на Python

А Менеджер завантажень це в основному комп’ютерна програма, призначена для завантаження окремих файлів з Інтернету. Тут ми збираємося створити простий менеджер завантажень за допомогою потоків на Python. Використовуючи багатопотоковість, файл можна завантажувати у вигляді фрагментів одночасно з різних потоків. Щоб реалізувати це, ми створимо простий інструмент командного рядка, який приймає URL-адресу файлу, а потім завантажує його.

Необхідні умови: машина Windows із встановленим Python.

Налаштування

Завантажте наведені нижче пакети з командного рядка.

1. Пакет Click: Click — це пакет Python для створення красивих інтерфейсів командного рядка з мінімальною кількістю коду. Це набір для створення інтерфейсу командного рядка.

pip install click

2. Пакет запитів: у цьому інструменті ми збираємося завантажити файл на основі URL-адреси (HTTP-адреси). Requests — це бібліотека HTTP, написана мовою Python, яка дозволяє надсилати HTTP-запити. Ви можете додавати заголовки до файлів, що складаються з даних, і параметрів за допомогою простих словників Python і таким же чином отримувати доступ до даних відповіді.

запити встановлення pip

3. Пакет Threading: Для роботи з потоками нам потрібен пакет Threading.

pip install threading

Реалізація

Примітка:

Програму було розділено на частини, щоб було легше зрозуміти. Переконайтеся, що ви не пропускаєте жодної частини коду під час роботи програми.

Крок 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  ()   


Ми закінчили з частиною кодування, і тепер виконайте наведені нижче команди, щоб запустити файл .py.

 python filename.py –-help  

Вихід:

help_outputpython filename.py –-help


Ця команда показує використання інструмента команди клацання та параметри, які цей інструмент може приймати. Нижче наведено зразок команди, у якій ми намагаємося завантажити файл зображення jpg з URL-адреси, а також вказуємо ім’я та кількість_потоків.

Скріншот-2025-04-07-155058зразок команди для завантаження jpg

Після успішного виконання всіх завдань ви зможете побачити свій файл (у цьому випадку flower.webp) у каталозі папки, як показано нижче:

Скріншот-2025-04-07-155750каталог

Нарешті ми успішно закінчили це, і це один із способів створити простий багатопоточний менеджер завантажень на Python.