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()

  

时间: 2024-10-14 17:51:30

python写的多线程下载工具的相关文章

linux下多线程下载工具axel的编译安装

axel 是Linux 命令行下多线程的下载工具,支持断点续传,速度通常情况下是Wget的几倍 官方主页:http://axel.alioth.debian.org/ 源码下载: #curl -O http://pkgs.fedoraproject.org/repo/pkgs/axel/axel2.4.tar.gz/a2a762fce0c96781965c8f9786a3d09d/axel-2.4.tar.gz 编译安装: # tar -xvf axel-2.4.tar.gz  && cd

CentOS6.4 安装aria2多线程下载工具

aria2是一个Linux下的多线程下载工具,支持HTTP/HTTPS.FTP.BitTorrent.Metalink协议. 平时在linux上下载http上的东西常用如wget.curl命令,但是他们都是单线程下载的.这里系统是CentOS6.3 64bit. aria2官方项目页面:http://aria2.sourceforge.net/ 安装aria2: wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.

用Python写一个ftp下载脚本

用Python写一个ftp下载脚本 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题.因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者. 需

Linux下多线程下载工具MWget和Axel使用介绍

linux运维在操作linux过程中,用得最多的linux下载工具想必一定是wget,没有看到哪一台服务器没装过wget的,或许有人使用ftp下载,也有人使用多线程的axel以及ProZilla,毫无疑问这两个工具都非常的出色,但是对于习惯使用wget的人来说显得不适应,于是老外便开发了多线程版本的wget工具mwget,m表示multi多线程的意思. mwget官方地址:http://sourceforge.net/projects/kmphpfm/?source=dlp # cd /usr/

多线程下载工具之 Axel

Axel 是 Linux 平台下的一款 HTTP/FTP 的告诉下载工具,支持多线程以及断点续传,对于一些有速度限制的服务器上下载东西时,Axel 的速度就明显比 wget 要快一些 Fedora 23+ 安装 dnf -y intsall axel CentOS 7.x 安装 CentOS 的 yum 中本来是不包含 axel 这个软件包的,如果要使用需要先添加 epel 拓展 yum -y install epel-release yum -y install axle 参数以及使用方法 用

Linux多线程下载工具Axel

Axel是 Linux 下一款不错的 HTTP 或 FTP 高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件,适合网速不给力时多线程下载以提高下载速度.需要注意的是,该软件只有命令行界面. 安装 sudo apt-get install axel 使用 axel [OPTIONS] url1 [url2] [url…] -n x  指定线程数(x 必须为大于 0 的数字) -o x  指定另存为目录(x 必须为本地目录) -s x  指定下载速度(

Linux下多线程下载工具 - Axel

Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件.适合网速不给力时多线程下载提高下载速度.比如在国内VPS或服务器上下载lnmp一键安装包用Axel就比wget快. CentOS安装Axel: 目前yum源上没有Axel,我们可以到http://pkgs.repoforge.org/axel/下载rpm包安装. 32位CentOS执行下面命令: wget -c http://pkgs.repof

Linux 下多线程下载工具: axel

wget 应该是最常用的下载工具了,但是其不支持多线程下载. axel 安装 epel 源有 axel 的二进制包,可以使用 yum 安装. yum install epel-release yum install axel axel 使用方法 Syntax : axel [OPTIONS] url1 [url2,url3,...] OPTIONS: --max-speed=x, -s x : 设定最大下载速度. --num-connections=x, -n x : 设定并发下载数 --out

LINUX MAC Axel —— 一款比 wget 更强大的多线程下载工具

前言 最近使用 wget 下载百度云资源,速度比较缓慢,在朋友推荐多线程下载后发现 wget 其实仅仅是一个单线程下载工具,在面对文件时会显得十分鸡肋,并且有许多诟病,比如无断点重连等等功能. Axel 介绍 经过一些搜索后发现,有一个非常好用的下载工具名为 Axel ,和 wget 一样是命令行下的下载工具,但是支持多线程下载,断点重连等等强大的功能. 以下是 man 中它的英文介绍以及翻译: axel - light command line download accelerator. Ax