Linux环境下 多线程下载 (Python 实现版)
本文是多年前学习编程时参照一个网友程序的基础之上改写的, 采用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 实现版)的更多相关文章
- linux环境下zookeeper下载安装
步骤一:安装配置jdk环境 1.下载解压jdk-8u221-linux-x64.tar.gz 2.打开 配置文件,vim /etc/profile,添加如下配置,添加完成记得source /etc/p ...
- JDK_1.8的Windows和Linux环境下的下载与安装
下载: Eclipse需要Jdk,MyEclipse有自带的Jdk 直接点击下载. Windows下JDK安装: 双击运行程序 下一步: 路径 更改到E:\Software\Java\jre1.8.0 ...
- 多线程编程之Linux环境下的多线程(二)
上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...
- [Linux]pycharm在Linux环境下安装
之前转载了一个在Windows环境下pycharm专业破解的安装的文章,今天为了在Linux环境下安装使用odoo10,所以尝试在Linux环境下安装pycharm专业破解版看看. windows下安 ...
- Linux环境下Python的安装过程
Linux环境下Python的安装过程 前言 一般情况下,Linux都会预装 Python了,但是这个预装的Python版本一般都非常低,很多 Python的新特性都没有,必须重新安装新一点的版本,从 ...
- Linux 环境下安装python相关
目录 Linux 环境下安装python相关 linux软件包管理工具之yum工具(如同pip3工具) yum源理解 下载阿里云的.repo仓库文件 ,放到/etc/yum.repos.d/ yum安 ...
- linux环境下安装python 3
说明: 在linux环境下,都默认安装python 2的环境,由于python3在python2的基础上升级较大,所以安装python 3环境用于使用最新的python 3的语法. 安装过程: 1.下 ...
- 尚学linux课程---10、linux环境下安装python
尚学linux课程---10.linux环境下安装python 一.总结 一句话总结: 直接在官网下载python的源码包即可,然后在linux下安装 linux下安装软件优先想到的的确是yum,但是 ...
- linux环境下安装git(采用github下载git源码编译)
[目的]:linux环境下 安装配置git成功 [准备条件]linux系统,git包 1.先行下载git包 -- 从github上https://github.com/git/git/releases ...
随机推荐
- shell 使用变量
使用变量 使用一个定义过的变量,只要在变量名前面加美元符号即可,如: your_name="qinjx" echo $your_name echo ${your_name} 变量名 ...
- SQLServer中对时间和长度的处理
---关于时间处理的函数 GETDATE() DATEADD(DAY,-20,GETDATE()) CONVERT(VARCHAR(100), GETDATE(), 112) DATENAME(PAR ...
- RobotFramework安装指南
Python下载 https://www.python.org/downloads Setuptools下载 https://pypi.python.org/pypi/setuptools 用原装各种 ...
- android--------根据文件路径使用File类获取文件相关信息
Android通过文件路径如何得到文件相关信息,如 文件名称,文件大小,创建时间,文件的相对路径,文件的绝对路径等. 如图: public class MainActivity extends Act ...
- Tree CodeForces - 1111E (树,计数,换根)
大意: 给定树, 多组询问, 每个询问给出一个点集$S$, 给定$m, r$, 求根为$r$时, $S$的划分数, 满足 每个划分大小不超过$m$ 每个划分内不存在一个点是另一个点的祖先 设点$x$的 ...
- thinkphp if标签
1.thinkphp框架中的if标签,用于html页面中.在html中编写php代码 1).从控制器中得到数据在循环中if else 判断:<volist name="system_r ...
- hdu 1704 (Floyd 传递闭包)
Rank Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDOJ1007
/** 最近点对问题,时间复杂度为O(n*logn*logn) */ #include <iostream> #include <cstdio> #include <cs ...
- 在菜鸟教程学 HTML(一)
注意:对于中文网页需要使用 <meta charset="utf-8"> 声明编码,否则会出现乱码.有些浏览器会设置 GBK 为默认编码,则你需要设置为 <met ...
- [Spring Boot] 使用多个Servlet
当使用Spring boot的嵌入式servlet容器时,可以通过Spring bean或扫描Servlet组件的方式注册Servlet.Filter和Servlet规范的所有监听器(例如HttpSe ...