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