说明:
因为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> [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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。