Python でのシンプルなマルチスレッド ダウンロード マネージャー
あ ダウンロードマネージャー 基本的には、インターネットからスタンドアロン ファイルをダウンロードするタスク専用のコンピューター プログラムです。ここでは、Python のスレッドを使用して単純なダウンロード マネージャーを作成します。マルチスレッドを使用すると、ファイルを異なるスレッドからチャンクの形式で同時にダウンロードできます。これを実装するには、ファイルの URL を受け取ってダウンロードする簡単なコマンドライン ツールを作成します。
前提条件: Python がインストールされた Windows マシン。
設定
コマンドプロンプトから以下のパッケージをダウンロードします。
1. Click パッケージ: Click は、必要最小限のコードで美しいコマンド ライン インターフェイスを作成するための Python パッケージです。それはコマンドラインインターフェイス作成キットです。
pipインストールクリック
2. パッケージのリクエスト: このツールでは、URL (HTTP アドレス) に基づいてファイルをダウンロードします。 Requests は、HTTP リクエストを送信できるようにする Python で書かれた HTTP ライブラリです。データのマルチパート ファイルからヘッダーを追加し、単純な Python ディクショナリを使用してパラメータを追加し、同じ方法で応答データにアクセスできます。
pipインストールリクエスト
3. スレッド化パッケージ: スレッドを使用するには、スレッド化パッケージが必要です。
pip インストール スレッド
実装
注記:
理解しやすいように、プログラムはいくつかの部分に分かれています。プログラムの実行中にコードの一部が欠けていないことを確認してください。
ステップ 1: 必要なパッケージをインポートする
これらのパッケージは、Web リクエストでコマンドライン入力を処理し、スレッドを作成するために必要なツールを提供します。
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: クリックで Main 関数を定義する
関数をコマンドライン ユーティリティに変換します。これは、ユーザーがコマンド ラインからスクリプトを操作する方法を定義します。
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 '