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 ...
随机推荐
- Darwin Streaming server 的 Task 类
Darwin Streaming Server 是一个开放源代码的streaming server,对于streaming server的编程和软件结构有着一定的参考价值,它是使用C++写的,其中的并 ...
- 转载RabbitMQ入门(1)--介绍
目录[-] "Hello World" (使用java客户端) 发送 接收 把所有放在一起 前面声明本文都是RabbitMQ的官方指南翻译过来的,由于本人水平有限难免有翻译不当的地 ...
- 【JSP】<meta>标签用法
转载自:http://blog.sina.com.cn/s/blog_65c74cce0102v39z.html 非常感谢这位博主,急着用,改日再细细品味重新整理这篇博文. http-equiv M ...
- 【转】自定义UITableViewCell控件阻挡回调不到didSelectRowAtIndexPath的解决办法
原文网址:http://blog.talisk.cn/blog/2015/09/01/uitableview-didselectrowatindexpath-cannot-be-called-tips ...
- Meta标签详解(转)
引言 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种: ● 在搜索引擎中登录自己的个人网站 ● 在知名网站加入你个 ...
- C++重要知识点小结---1
1.C++中类与结构的唯一区别是:类(class)定义中默认情况下的成员是private的,而结构(struct)定义中默认情况下的成员是public的. 2. ::叫作用域区分符,指明一个函数属于哪 ...
- [转]解决crystal report水晶报表在浏览器提示bobj未定义的错误
网上的中文文章(比如这篇文章)都是写的部署到服务器后出现的问题,同时也指出要把crystal report的aspnet_client文件夹拷贝到对应项目的根目录里,这样就可以正常显示了,但是具体到我 ...
- 修改Eclipse的EasyExplore插件的键盘快捷键
工欲善其事,必先利其器 为了高效的编码,一个顺手的IDE是必不可少的. Eclipse下的EasyExplore插件挺不错,经常会打开项目的文件夹查找内容,只是日渐习惯全部键盘操作后,有时想使用Eas ...
- webstorm下设置sass
关于sass,就不想多说什么了.只要你有css基础,十分钟入门好吗.可以参考下资料:http://www.w3cplus.com/sassguide/ 今天想说的是webStorm下如何实现sass自 ...
- LeetCode题解——Regular Expression Matching
题目: 正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次. 解法: 一定要注意'*'必须结合前面的字符一起使用. 代码: class S ...