ホームページ > バックエンド開発 > Python チュートリアル > マルチスレッドのファイルダウンロードを実装するための Python コード例

マルチスレッドのファイルダウンロードを実装するための Python コード例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-16 08:44:02
オリジナル
1175 人が閲覧しました

単純なマルチスレッドダウンロードを実装するには、次の点に注意する必要があります:
1. ファイルサイズ: 応答ヘッダーから抽出できます。たとえば、「Content-Length:911」はサイズを意味します。は 911 バイトです
2 .タスク分割: 各スレッドがダウンロードするファイルの部分を指定します。リクエスト ヘッダーに「範囲: bytes=300-400」(300 ~ 400 バイトのコンテンツをダウンロードすることを示す) を追加できます。リクエストできるファイルの数は [0 , size-1] バイトです。
3. ダウンロードされたファイルの集約: 各スレッドは、ダウンロードしたファイル ブロックを一時ファイルとして保存します。すべてのスレッドが完了した後、これらの一時ファイルが集約され、最終ファイルに順番に書き込まれます。

実装コード:

コードをコピー コードは次のとおりです:

#!/usr/bin/python
# -*- コーディング: utf-8 -*-
# ファイル名: paxel.py
# FROM: http://jb51. net/code/view/58/full/
# Jay はそれを少し修正し、今後の使用の可能性のために保存しました。

'''これはマルチスレッドのダウンロード ツールです

axel に従って開発されました。
著者: volans
電子メール: volansw [at] gmail.com
'''

import sys
import os
import time
import urllib
from threading import Thread

# http_proxy
local_proxies = {'http': 'http://131.139.58.200:8080'}
を使用する場合

class AxelPython(Thread, urllib.FancyURLopener):
''''マルチスレッドのダウンロード クラス。

run() は Thread の仮想メソッドです。
'''
def __init__(self, threadname, url, filename, ranges=0, proxies={}):
Thread.__init__(self, name=threadname)
urllib.FancyURLopener.__init__(self, proxies)
self.name = threadname
self.url = url
self.filename = filename
self.ranges = ranges
self.downloaded = 0

def run(self ):
''スレッド内の仮想関数''
try:
self.downloaded = os.path.getsize(self.filename)
OSError を除く:
#print 'never download'
self.downloaded = 0

# リビルド開始点
self.startpoint = self.ranges[0] + self.downloaded

# この部分は完了しました
if self.startpoint >= self.ranges[1]:
print 'パーツ %s はダウンロードされました。' % self.filename
return

self.oneTimeSize = 16384 # 16kByte/time
print 'タスク %s は %d から %d にダウンロードされます' % (self.name, self.startpoint, self.ranges[1])

self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))
self.urlhandle = self.open(self.url)

data = self.urlhandle.read(self.oneTimeSize)
while data:
filehandle = open(self.filename, 'ab+')
filehandle.write(data)
filehandle.close()

self.downloaded += len(data)
#print "%s" % (self.name)
#進捗状況= あなた...'

data = self.urlhandle.read(self.oneTimeSize)


def GetUrlFileSize(url, proxies={}):
urlHandler = urllib.urlopen(url, proxies=proxies)
headers = urlHandler.info().headers
length = 0
headers 内のヘッダーの場合:
if header.find ('長さ') != -1:
length = header.split(':')[-1].strip()
length = int(length)
return length


def SpliteBlocks(totalsize, blocknumber):
blocksize = totalsize / blocknumber
ranges = []
for i in range(0, blocknumber - 1):
ranges.append(( i * ブロックサイズ、i * ブロックサイズ + ブロックサイズ - 1))
ranges.append((ブロックサイズ * (ブロック番号 - 1), totalsize - 1))

範囲を返します


def islive(tasks):
タスク内のタスクの場合:
if task.isAlive():
return True
return False


def paxel(url, Output 、ブロック=6、プロキシ=ローカルプロキシ):
''' paxel
'''
サイズ = GetUrlFileSize(url, プロキシ)
範囲 = SpliteBlocks(サイズ, ブロック)

スレッド名 = ["thread_%d" % i for i in range(0, tables)]
filename = ["tmpfile_%d" % i for i in range(0, tables)]

タスク = []
for i in range(0, ブロック):
task = AxelPython(threadname[i], url, filename[i], ranges[i])
task.setDaemon(True)
task.start()
task.append(task)

time.sleep(2)
while islive(task):
downloaded = sum([task.downloaded forタスク内のタスク])
process = ダウンロード済み / float(size) * 100
show = u'rFilesize:%d ダウンロード済み:%d 完了済み:%.2f%%' % (サイズ、ダウンロード済み、プロセス)
sys.stdout.write(show)
sys.stdout.flush()
time.sleep(0.5)

ファイルハンドル = open(output, 'wb+')
for iファイル名内:
f = open(i, 'rb')
filehandle.write(f.read())
f.close()
try:
os.remove(i )
pass
ただし:
pass

filehandle.close()

if __name__ == '__main__':
url = 'http://dldir1 .qq.com/qqfile/QQforMac/QQ_V3.1.1.dmg'
出力 = 'download.file'
paxel(url, 出力, ブロック=4, プロキシ={})
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート