python wget并行下载文件

说明:

  因为python线程的性能问题,在python中使用多线程运行代码经常不能达到预期的效果。而有些时候我们的逻辑中又需要开更高的并发,或者简单的说,就是让我们的代码跑的更快,在同样时间内执行更多的有效逻辑、减少无用的等待。gevent就是一个现在很火、支持也很全面的python第三方协程库。
    gevent是python的一个并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。而且其中有个monkey类,将现有基于Python线程直接转化为greenlet(类似于打patch)。在运行时的具体流程大概就是:
    当一个greenlet遇到IO操作时,比如访问网络/睡眠等待,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。同时也因为只有一个线程在执行,会极大的减少上下文切换的成本。

#!/bin/python
#coding = UFT-8

import gevent
from gevent import socket
from gevent import monkey; monkey.patch_all()
import sys,os,wget
import urllib2
import subprocess


def download(url):
###下为判断url是否存在。。####
    try:
        url_opener = urllib2.urlopen(url)
    except:
        print 'open url error'

        return

    if url_opener.code!=200:
        print 'return code is:%d'%(url_opener.code)

        return

    if not url_opener.headers.has_key('Content-Length'):
        print 'no content length'

        return

    file_name = url[url.rfind('/')+1:]
    
    #wget.download(url)

    status_subprocess =  subprocess.call('wget -c %s' %(url),shell=True)   

    if status_subprocess == 0:
        print '[%s]:download complete!' % (file_name)
    else:
        print '[%s]:download failed !' % (file_name)
 

list_file_name = sys.argv[1]

print list_file_name
print sys.argv

file1 = open(list_file_name,'r')
s = file1.read()
#print s


apkurl_list = s.split()
#print apkurl_list


if __name__=='__main__':

    argc = len(sys.argv)

    if argc<2:

        print 'usage:%s  [url...]' % (sys.argv[0])

        sys.exit(-1)

    #jobs = [gevent.spawn(download,url) for url in sys.argv[1:]]
    jobs = [gevent.spawn(download,url) for url in apkurl_list]

    gevent.joinall(jobs, timeout=600)
wget -c url -c:为断点续传模式 ,ctrl+C是杀不掉,只kill -QUIT 或者跑完
[root@silence tmp]# cat apk.list 
http://axk.cdn.lx7.com/2915/sxxxxxxxxxxxxxxb7.apk
http://cdnxxx.ofxme.net/axxxets/Axx346/mjxxxxx03.apk

[root@silence tmp]# python apkbingxingdownload.py apk.list

python wget并行下载文件_第1张图片

你可能感兴趣的:(python2.7,wget,gevent)