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 '