Python でのシンプルなマルチスレッド ダウンロード マネージャー

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  '    '   *   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  

出力:

ヘルプ_出力Python ファイル名.py –-ヘルプ


このコマンドは、クリック コマンド ツールの使用法とツールが受け入れることができるオプションを示します。以下は、URL から jpg 画像ファイルをダウンロードし、名前とスレッド数を指定するサンプル コマンドです。

スクリーンショット-2025-04-07-155058jpgをダウンロードするサンプルコマンド

すべてが正常に実行されると、以下に示すように、フォルダー ディレクトリにファイル (この場合はflower.webp) が表示されるようになります。

スクリーンショット-2025-04-07-155750ディレクトリ

これは、Python でシンプルなマルチスレッド ダウンロード マネージャーを構築する方法の 1 つです。