測試平臺 Ubuntu 13.04 X86_64 Python 2.7.4
花了將近兩個小時, 問題主要剛開始沒有想到傳一個文件對象到線程里面去, 導致下載下來的文件和源文件MD5不一樣,浪費不少時間.
有興趣的同學可以拿去加上參數,改進下, 也可以加上斷點續傳.
代碼如下:
# -*- coding: utf-8 -*-
# Author: ToughGuy
# Email: wj0630@gmail.com
# 寫這玩意兒是為了初步了解下python的多線程機制
# 平時沒寫注釋的習慣, 這次花時間在代碼里面寫上注釋也是希望有問題的地方請各位指正, 因為可能我自己也沒弄明白.
# 測試平臺 Ubuntu 13.04 X86_64 Python 2.7.4
import threading
import urllib2
import sys
max_thread = 10
# 初始化鎖
lock = threading.RLock()
class Downloader(threading.Thread):
def __init__(self, url, start_size, end_size, fobj, buffer):
self.url = url
self.buffer = buffer
self.start_size = start_size
self.end_size = end_size
self.fobj = fobj
threading.Thread.__init__(self)
def run(self):
"""
馬甲而已
"""
with lock:
print 'starting: %s' % self.getName()
self._download()
def _download(self):
"""
我才是搬磚的
"""
req = urllib2.Request(self.url)
# 添加HTTP Header(RANGE)設置下載數據的范圍
req.headers['Range'] = 'bytes=%s-%s' % (self.start_size, self.end_size)
f = urllib2.urlopen(req)
# 初始化當前線程文件對象偏移量
offset = self.start_size
while 1:
block = f.read(self.buffer)
# 當前線程數據獲取完畢后則退出
if not block:
with lock:
print '%s done.' % self.getName()
新聞熱點
疑難解答