本文是多年前学习编程时参照一个网友程序的基础之上改写的, 采用Python语音编写, 多线程下载功能, 可以有效提高Linux下原有下载工具中的一些不足,以下给出具体代码。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author: Devilmaycry
# Email: 812839668@qq.com
# 本程序是多年前参照他人代码所写,并在原基础上做了一定改进,因时间过久已无法给出原出处,特此声明
# 测试平台 Ubuntu 14.04 X86_64 Python 2.7.6 import threading
import urllib2
import sys
import time # 全局最大线程数
max_thread = 20 # 初始化锁
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) #重连接次数
self.i = 1 def run(self):
print 'starting: %s' % self.getName()
self._download() def _download(self):
while True:
try:
offset = self.start_size req = urllib2.Request(self.url) # 添加HTTP Header(RANGE)设置下载数据的范围
req.headers['Range'] = 'bytes=%s-%s' % (self.start_size, self.end_size) f = urllib2.urlopen(req, timeout = 15) # 初始化当前线程文件对象偏移量
while 1:
block = f.read(self.buffer) # 当前线程数据获取完毕后, 则退出
if not block:
print '%s done.' % self.getName()
break with lock:
# 设置文件对象偏移地址
self.fobj.seek(offset) # 写入获取到的数据
self.fobj.write(block) offset = offset + len(block)
break
except Exception:
print self.getName() + " failed time " + "====="*10 + str(self.i) + "\n"
self.i = self.i + 1
self.start_size = offset def main(url, threadNum=30, save_file='', buffer=1024):
# 最大线程数量不能超过max_thread
threadNum = threadNum if threadNum <= max_thread else max_thread # 获取文件的大小
req = urllib2.urlopen(url)
size = int(req.info().getheaders('Content-Length')[0]) # 初始化文件对象
fobj = open(save_file, 'wb') # 根据线程数量计算 每个线程负责的http Range 大小
avg_size, pad_size = divmod(size, threadNum) plist = [] for i in xrange(threadNum):
start_size = i*avg_size
end_size = start_size + avg_size - 1 if i == threadNum - 1:
# 最后一个线程加上pad_size
end_size = end_size + pad_size + 1 pTemp = Downloader(url, start_size, end_size, fobj, buffer) plist.append(pTemp) # 开始搬砖
for t in plist:
t.start() # 等待所有线程结束
for t in plist:
t.join() # 结束当然记得关闭文件对象
fobj.close()
print 'Download completed!' if __name__ == '__main__':
start = time.time() #url = "http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ7.1.14509.0.1429585990.exe"
url="https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.7.tgz" main(url=url, threadNum=20, save_file='test', buffer=4096) end = time.time() print end-start

Linux环境下 多线程下载 (Python 实现版)的更多相关文章

  1. linux环境下zookeeper下载安装

    步骤一:安装配置jdk环境 1.下载解压jdk-8u221-linux-x64.tar.gz 2.打开 配置文件,vim /etc/profile,添加如下配置,添加完成记得source /etc/p ...

  2. JDK_1.8的Windows和Linux环境下的下载与安装

    下载: Eclipse需要Jdk,MyEclipse有自带的Jdk 直接点击下载. Windows下JDK安装: 双击运行程序 下一步: 路径 更改到E:\Software\Java\jre1.8.0 ...

  3. 多线程编程之Linux环境下的多线程(二)

    上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...

  4. [Linux]pycharm在Linux环境下安装

    之前转载了一个在Windows环境下pycharm专业破解的安装的文章,今天为了在Linux环境下安装使用odoo10,所以尝试在Linux环境下安装pycharm专业破解版看看. windows下安 ...

  5. Linux环境下Python的安装过程

    Linux环境下Python的安装过程 前言 一般情况下,Linux都会预装 Python了,但是这个预装的Python版本一般都非常低,很多 Python的新特性都没有,必须重新安装新一点的版本,从 ...

  6. Linux 环境下安装python相关

    目录 Linux 环境下安装python相关 linux软件包管理工具之yum工具(如同pip3工具) yum源理解 下载阿里云的.repo仓库文件 ,放到/etc/yum.repos.d/ yum安 ...

  7. linux环境下安装python 3

    说明: 在linux环境下,都默认安装python 2的环境,由于python3在python2的基础上升级较大,所以安装python 3环境用于使用最新的python 3的语法. 安装过程: 1.下 ...

  8. 尚学linux课程---10、linux环境下安装python

    尚学linux课程---10.linux环境下安装python 一.总结 一句话总结: 直接在官网下载python的源码包即可,然后在linux下安装 linux下安装软件优先想到的的确是yum,但是 ...

  9. linux环境下安装git(采用github下载git源码编译)

    [目的]:linux环境下 安装配置git成功 [准备条件]linux系统,git包 1.先行下载git包 -- 从github上https://github.com/git/git/releases ...

随机推荐

  1. python排序(插入排序) 从小到大顺序

    def insert_sort(ilist): for i in range(len(ilist)): for j in range(i): if ilist[i] < ilist[j]: il ...

  2. JSON序列化反序列化

    JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的文本格式,可以很容易在 ...

  3. RabbitMQ入门_15_访问控制

    参考资料:https://www.rabbitmq.com/access-control.html A. 核心概念 Virtual Host:虚拟主机为 RabbitMQ 中的资源提供了逻辑分组与隔离 ...

  4. m_Orchestrate learning system---三十五、php数据和js数据的解耦:php数据(php代码)不要放到js代码中

    m_Orchestrate learning system---三十五.php数据和js数据的解耦:php数据(php代码)不要放到js代码中 一.总结 一句话总结:也就是以html为中介,用html ...

  5. ubuntu , 笔记本合上盖子时不关机的方法。

    实测ubuntu 14.04 好使 1) 编辑 /etc/systemd/logind.conf 2) 找到 HandleLidSwitch 设置,去掉行头注释#,然后改成下面这样 HandleLid ...

  6. Yii 语言设置 中文提示信息

    1.  在main.php配置文件中加入 'language'=>'zh_cn', 注: 在URL中追加参数lang=zh_cn即可实现中文 2.  在Controller方法中添加 publi ...

  7. python-day39--mysql基本操作

    1.修改密码: mysqladmin -uroot password 123 2.忘记密码如何修改密码: 1.干掉data目录---> 重新初始化   (不推荐,所有授权信息全部丢失!!!) 2 ...

  8. zzuli 1430 多少个0

    https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1430 1430: 多少个0 Time Limit: 1 Sec  Memory Limit: 12 ...

  9. 基础最短路(模板 bellman_ford)

    Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...

  10. 72. Edit Distance *HARD*

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...