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 ...
随机推荐
- uestc 1725 吴神数
// 筛选法// 先求出 sqrt(1<<31)内的素数// 然后筛选出符合要求的数// 详情见代码注释// #pragma comment(linker, "/STACK:10 ...
- Oracle中job的使用详解
我们在项目开发中,常常会有一些复杂的业务逻辑.使用oracle的存储过程,可以大大减少java程序代码的编写工作量,而且存储过程执行在数据库上,这样可以利用oracle的良好性能支持,极大地提高程序执 ...
- IE下JS接受ActiveX控件方法
1.常规写法 <SCRIPT type="text/javascript" FOR="activexID" EVENT="onXXXevent( ...
- 开源Jabber(XMPP) IM服务器介绍
一.摘要 这是我粗略读了一遍Jabber协议和相关技术文章后的产物,有些地方不一定准确.在文章中引用的一些代码来自www.jabber.org上的文章. 二. 什么是Jabber Jabber就 ...
- Oracle 课程八之性能优化之10053事件
一. 10053事件 当一个SQL出现性能问题的时候,可以使用SQL_TRACE 或者 10046事件来跟踪SQL. 通过生成的trace来了解SQL的执行过程. 我们在查看一条SQL的执行计划的时候 ...
- C# 无边框异型窗体制作
我是一个C#的初学者 只要涉及到windows窗体编程 都希望窗体的外观比较好看 不是系统默认的那样 对于C# 更改窗体外观感觉并不那么轻松 更改窗体外观涉及到使用GDI+ 我所知道的有两种方法: 有 ...
- SQL Server缺省约束、列约束和表约束
SQL Server缺省约束是SQL Server数据库中的一种约束,下面就为您介绍SQL Server缺省约束.列约束和表约束的定义方法啊,供您参考. SQL Server缺省约束 SQL Serv ...
- 使用calabash测试开源中国Android客户端
Calabash-android是支持android的UI自动化测试框架,前面已经介绍过<中文Win7下成功安装calabash-android步骤>,这篇博文尝试测试一个真实应用:开源中 ...
- [原创]谷歌插件 - YE启动助手(YeLauncher)
版本:v1.1 更新时间:2013/11/01 * 代码完善 + 右键关于显示当前版本号,点击并链接到软件帮助页 版本:v1.0 更新时间:2013/10/20 + 插件原型
- linux下mysql数据库的学习
转载博客:http://freedomljtt.blog.163.com/blog/static/72294949201210145441701/ ubuntu12.04 卸载和安装mysql 卸载m ...