python写的多线程下载工具
其实只是想练习一下threading的用法。
写完后发现其实下载速度也没增加多少,略显尴尬,汗
# -*- coding: cp936 -*-
import urllib2
import threading
import os,os.path
import sys
import time,datetime url = ''
path = os.getcwd() file_name = ''
file_fp=''
net_filesize = 0
size_download = 0
threadlock = threading.Lock() Thread_Num = 10
Block_Size = 16384 def get_filename_from_url(url):
return url[url.rfind('/')+1:] def get_net_file_info(url):
r = urllib2.urlopen(url)
fs = int(r.info()['Content-Length'])
if r.info().has_key('Content-Disposition'):
fn = r.info()['Content-Disposition'].split('filename=')[1]
fn = fn.replace('"', '').replace("'", "")
else:
fn = get_filename_from_url(url)
r.close()
return fs,fn def file_write_init():
global file_fp,net_filesize,file_name
net_filesize,file_name = get_net_file_info(url)
full_path= os.path.join(path,file_name)
if os.path.isfile(full_path) == True:return False
file_fp = file(full_path,"wb")
file_fp.truncate(net_filesize)
return True def file_write(pos,dat):
global size_download
threadlock.acquire()
size_download += len(dat)
#print 'size_download:%d'%(size_download )
file_fp.seek(pos)
file_fp.write(dat)
threadlock.release() def file_write_finish():
file_fp.close() class mpdown(threading.Thread):
def __init__(self,range_start,range_end):
threading.Thread.__init__(self)
self.range_start = range_start
self.range_end = range_end
def run(self):
req = urllib2.Request(url)
req.add_header('Range','bytes=%d-%d'%(self.range_start,self.range_end))
r = urllib2.urlopen(req)
#print r.info()
pos_base = self.range_start
pos = 0
size_to_get = self.range_end - self.range_start +1
while pos<size_to_get:
dat = r.read(Block_Size)
l = len(dat)
if pos+len(dat)>size_to_get:
dat = dat[:size_to_get-pos]
file_write(pos+pos_base,dat)
pos += len(dat) def download_one_thread():
pass def download():
#check_range_acceptable()
#if file_length<thread_num use single thread
#download_one_thread()
#block size of each thread time_start = datetime.datetime.now()
if file_write_init() == False:
return
print 'file name:%s'%(file_name)
print 'net_filesize:%dbyte'%(net_filesize)
print 'multi process downloading...'
threads = []
thread_size = net_filesize / Thread_Num
left_size = net_filesize % Thread_Num
pos = 0
for i in xrange(0,Thread_Num):
range_start = pos
pos += thread_size-1
if i==0:pos += left_size
range_end = pos
pos += 1
t = mpdown(range_start,range_end)
threads.append(t)
#print 'range=%d-%d'%(range_start,range_end)
for t in threads:
t.start()
for t in threads:
t.join()
file_write_finish() time_end = datetime.datetime.now()
s = (time_end-time_start).seconds
if s<1:s=1
print 'time passed:%dh %dm %ds'%(s/3600,s/60,s%60)
print 'speed:%dkb/s'%(net_filesize/1000.0/s) def main():
global url
args = len(sys.argv)
if args>1:
for i in range(1,args):
url = sys.argv[i]
download()
else:
url = raw_input("input download url:")
download() def test():
req = urllib2.Request(url)
req.add_header('Range','bytes=%d-%d'%(1,500))
print req
r = urllib2.urlopen(req)
print r.info() if __name__ == '__main__':
main()
python写的多线程下载工具的更多相关文章
- linux多线程下载工具mwget
linux多线程下载工具mwget 经常使用wget进行文件下载,然而wget的处理速度并不如人意.遇到一些国外的站点,经常慢得像蜗牛一般.然而为了解决这个问题,便有了mwget:m表示multi多线 ...
- CentOS6.4 安装aria2多线程下载工具
aria2是一个Linux下的多线程下载工具,支持HTTP/HTTPS.FTP.BitTorrent.Metalink协议. 平时在linux上下载http上的东西常用如wget.curl命令,但是他 ...
- Python之FTP多线程下载文件之分块多线程文件合并
Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
- Linux下多线程下载工具myget
[root@superdba ~]# mytgetMytget 0.0.99: A download accelerator for GNU/LinuxUsage: mytget [options]. ...
- Linux 下的多线程下载工具 Axel
Axel 是 Linux 平台下的一款 HTTP/FTP 的高速下载工具,支持多线程以及断点续传,对于一些有速度限制的服务器上下载东西时,Axel 的速度就明显比 wget 要快一些 还有另一个基于 ...
- Linux下的多线程下载工具mwget
之前在做项目的时候,遇到一个难题,需要一个多线程下载器,于是阴差阳错的看到了这款工具--mwget,之所以是阴差阳错,是因为mwget的多线程下载功能,并不是我们想要的多线程. wget大家都知道吧, ...
- python实现的视频下载工具you-get,支持多个国内外主流视频平台
RT,you-get 是一个视频离线下载工具, https://github.com/soimort/you-get 另一个同类工具 youtube-dl 也是python 实现,虽然名为 youtu ...
- Python爬虫之多线程下载程序类电子书
近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下: 那么我们是否可以通过Py ...
随机推荐
- 搭建LAMP测试环境
LAMP:Linux+Apache+Mysql+Php,组合统称为LAMP,关于其中的独立个体,这里就不多介绍了. 1.首先准备一下软件包,如下: mysql-5.0.22.tar.gz httpd- ...
- 【转】自定义UITableViewCell控件阻挡回调不到didSelectRowAtIndexPath的解决办法
原文网址:http://blog.talisk.cn/blog/2015/09/01/uitableview-didselectrowatindexpath-cannot-be-called-tips ...
- jquery生成二维码
下载Demo js下载: jquery-1.8.3.js .qrcode.js.jquery.qrcode.js <!DOCTYPE html> <html> <head ...
- 利用Modbus协议读取电能表的数据
1.电脑要有485转232的转换器2.你要看懂DLT_645—1997规约的通讯协议,现在大多电能表厂都会遵行这个通讯协议,DLT_645—1997规约不是最新的通讯协议.就看电表的使用什么通讯协议. ...
- 字符集编码Unicode ,gb2312 cp936
这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一:使用Windows记事本的“另存为” ...
- 学习笔记之Linux内核编译过程
准备工作 物理主机:win8(32位) 虚拟机工具:VirtualBox_4.3.16_Win32 虚拟主机:xubuntu-12.04.4 安装virtualBox功能增强包 设置好虚拟机与主机的共 ...
- 机器学习——Logistic回归
参考<机器学习实战> 利用Logistic回归进行分类的主要思想: 根据现有数据对分类边界线建立回归公式,以此进行分类. 分类借助的Sigmoid函数: Sigmoid函数图: Sigmo ...
- NotePad++ delphi/Pascal函数过程列表插件
从cnpack上爬下来的 函数过程列表 点击下载
- openstack 云平台API
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAKrCAIAAACV8EEMAAAgAElEQVR4nOydeVgUaZ7n/W9299nd7n
- 单节点伪分布集群(weekend110)的Hive子项目启动顺序
因为,我的mysql是用root用户,在/home/hadoop/app/目录下,创建的. 第一步:开启mysql服务 第二步:启动hive [hadoop@weekend110 app]$ su r ...