python基于queue和threading实现多线程下载实例
本文实例讲述了python基于queue和threading实现多线程下载的方法,分享给大家供大家参考。具体方法如下:
主代码如下:
#downloadworker queue_download=Queue.Queue(0) DOWNLOAD_WORKERS=20 foriinrange(DOWNLOAD_WORKERS): DownloadWorker(queue_download).start()#startadownloadworker formd5inMD5S: queue_download.put(md5) foriinrange(DOWNLOAD_WORKERS): queue_download.put(None)
其中downloadworkers.py
类继承threading.Thread,重载run方法..在__init__中调用threading.Thread.__init__(self),
在run方法中实现耗时的操作
importthreading
importQueue
importmd5query
importDOM
importos,sys
classDownloadWorker(threading.Thread):
""""""
def__init__(self,queue):
"""Constructor"""
self.__queue=queue
threading.Thread.__init__(self)
defrun(self):
while1:
md5=self.__queue.get()
ifmd5isNone:
break#reachedendofqueue
#thisisatime-costproduce
self._down(md5)
print"task:",md5,"finished"
def_down(self,md5):
config={
'input':sys.stdin,
'output':'./samples',
'location':'xxx',
'has-fn':False,
'options':{'connect.timeout':60,'timeout':3600},
'log':file('logs.txt','w'),
}
print'download%s...'%(md5)
try:
data=downloadproc(config['location'],config['options'])#我的下载过程
ifdata:
dom,fileData=md5query.splited(data)
filename=md5
ifconfig['has-fn']:
filename='%s_%s'%(md5,dom.nodeValue2('xxxxxxx','').encode('utf-8'))#这是我的下载的方法
f=file(os.path.join(config['output'],filename),'w')
f.write(fileData)
f.close()
print'%s\tok'%(md5)
else:
print>>config['log'],'%s\t%s'%(md5,'failed')
exceptException,e:
print>>config['log'],'%s\t%s'%(md5,str(e))
希望本文所述对大家的Python程序设计有所帮助。