最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python多線程http下載實現(xiàn)示例

 更新時間:2013年12月30日 09:17:14   作者:  
python多線程http下載實現(xiàn)示例,大家參考使用吧

測試平臺 Ubuntu 13.04 X86_64 Python 2.7.4

花了將近兩個小時, 問題主要剛開始沒有想到傳一個文件對象到線程里面去, 導致下載下來的文件和源文件MD5不一樣,浪費不少時間.

有興趣的同學可以拿去加上參數(shù),改進下, 也可以加上斷點續(xù)傳.

復制代碼 代碼如下:

# -*- 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)設(shè)置下載數(shù)據(jù)的范圍
        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)
            # 當前線程數(shù)據(jù)獲取完畢后則退出
            if not block:
                with lock:
                    print '%s done.' % self.getName()
                break
            # 寫如數(shù)據(jù)的時候當然要鎖住線程
            # 使用 with lock 替代傳統(tǒng)的 lock.acquire().....lock.release()
            # 需要python >= 2.5
            with lock:
                sys.stdout.write('%s saveing block...' % self.getName())
                # 設(shè)置文件對象偏移地址
                self.fobj.seek(offset)
                # 寫入獲取到的數(shù)據(jù)
                self.fobj.write(block)
                offset = offset + len(block)
                sys.stdout.write('done.\n')


def main(url, thread=3, save_file='', buffer=1024):
    # 最大線程數(shù)量不能超過max_thread
    thread = thread if thread <= max_thread else max_thread
    # 獲取文件的大小
    req = urllib2.urlopen(url)
    size = int(req.info().getheaders('Content-Length')[0])
    # 初始化文件對象
    fobj = open(save_file, 'wb')
    # 根據(jù)線程數(shù)量計算 每個線程負責的http Range 大小
    avg_size, pad_size = divmod(size, thread)
    plist = []
    for i in xrange(thread):
        start_size = i*avg_size
        end_size = start_size + avg_size - 1
        if i == thread - 1:
            # 最后一個線程加上pad_size
            end_size = end_size + pad_size + 1
        t = Downloader(url, start_size, end_size, fobj, buffer)
        plist.append(t)

    #  開始搬磚
    for t in plist:
        t.start()

    # 等待所有線程結(jié)束
    for t in plist:
        t.join()

    # 結(jié)束當然記得關(guān)閉文件對象
    fobj.close()
    print 'Download completed!'

if __name__ == '__main__':
    url = 'http://192.168.1.2:8082/downloads/10M.zip'
    main(url=url, thread=10, save_file='test.iso', buffer=4096)

相關(guān)文章

  • django model的update時auto_now不被更新的原因及解決方式

    django model的update時auto_now不被更新的原因及解決方式

    這篇文章主要介紹了django model的update時auto_now不被更新的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python交互模式基礎(chǔ)知識點學習

    python交互模式基礎(chǔ)知識點學習

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python交互模式是什么的相關(guān)基礎(chǔ)知識點,需要的朋友們可以參考下。
    2020-06-06
  • 實例講解Python中浮點型的基本內(nèi)容

    實例講解Python中浮點型的基本內(nèi)容

    在本文里小編給大家整理了關(guān)于Python中浮點型的基本知識點內(nèi)容,有興趣的朋友們學習下。
    2019-02-02
  • 利用PyTorch進行模型量化的全過程

    利用PyTorch進行模型量化的全過程

    模型量化是一種降低深度學習模型大小和加速其推理速度的技術(shù),它通過減少模型中參數(shù)的比特數(shù)來實現(xiàn)這一目的,本文給大家介紹了利用PyTorch進行模型量化的全過程,需要的朋友可以參考下
    2024-07-07
  • python如何實現(xiàn)圖片重命名并保存

    python如何實現(xiàn)圖片重命名并保存

    這篇文章主要介紹了python如何實現(xiàn)圖片重命名并保存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python使用multiprocessing.Queue進行進程間通信

    Python使用multiprocessing.Queue進行進程間通信

    本文主要介紹了Python使用multiprocessing.Queue進行進程間通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • python網(wǎng)絡(luò)爬蟲精解之Beautiful Soup的使用說明

    python網(wǎng)絡(luò)爬蟲精解之Beautiful Soup的使用說明

    簡單來說,Beautiful Soup 是 python 的一個庫,最主要的功能是從網(wǎng)頁抓取數(shù)據(jù),Beautiful Soup 提供一些簡單的、python 式的函數(shù)用來處理導航、搜索、修改分析樹等功能,需要的朋友可以參考下
    2021-09-09
  • python中PS 圖像調(diào)整算法原理之亮度調(diào)整

    python中PS 圖像調(diào)整算法原理之亮度調(diào)整

    這篇文章主要介紹了python中PS 圖像調(diào)整算法原理之亮度調(diào)整,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Python生成器常見問題及解決方案

    Python生成器常見問題及解決方案

    這篇文章主要介紹了Python生成器常見問題及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • python函數(shù)的默認參數(shù)請勿定義可變類型詳解

    python函數(shù)的默認參數(shù)請勿定義可變類型詳解

    這篇文章主要介紹了python函數(shù)的默認參數(shù)請勿定義可變類型詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

马边| 呼伦贝尔市| 河间市| 旬阳县| 临洮县| 全州县| 乳山市| 保定市| 湘阴县| 拉孜县| 巴林右旗| 河津市| 中阳县| 宁都县| 泽普县| 涟水县| 武乡县| 黄浦区| 方城县| 托克托县| 阜城县| 青田县| 太康县| 吉水县| 盘锦市| 平定县| 黔西| 府谷县| 黔西县| 新密市| 奉化市| 松桃| 阳新县| 班玛县| 九龙坡区| 防城港市| 凌海市| 宜阳县| 白水县| 镇宁| 宜兴市|