多线程找当前目录(包括子目录)占用空间前25位的文件,当前目录25位,[Python]代码#c


[Python]代码

#coding=utf-8#找到当前目录前MACX(default:25)位占用空间最大的文件-多线程import os,os.pathfrom ConfigParser import RawConfigParser as rcpfrom threading import Thread,Lockimport sysimport timeMAXC=25def insert(tenmax,filename,filesize):    i=0    while i<len(tenmax) and tenmax[i][1]>filesize:        i+=1    tenmax.insert(i,[filename,filesize])def keepTenMax(tenmax,filename,filesize):    i=len(tenmax)    if i<MAXC:        insert(tenmax,filename,filesize)    else:        if filesize>tenmax[i-1][1]:            insert(tenmax,filename,filesize)            tenmax.pop()        elif filesize==tenmax[i-1][1]:            tenmax.append([filename,filesize])            if len(tenmax)>MAXC:                tenmax=tenmax[:MAXC]        else:            returnclass MyThread(Thread):#多线程搜索    def __init__(self,root,files,tname):        Thread.__init__(self)        self.root=root        self.files=files        self.name=tname        self.tenmax=[]    def run(self):        global count        for f in self.files:            filename=self.root+os.sep+f            filesize=os.stat(filename).st_size            mylock.acquire() #获得锁            count+=1            mylock.release() #释放锁            keepTenMax(self.tenmax,filename,filesize)def allDone(threadlist):    for i in threadlist:        if i.isAlive():            return False    return True#mainif __name__=="__main__":    global count #全局 文件计数    mylock=Lock() #define a lock     count=1    tenmax=[]    threadlist=[]    if len(sys.argv)==1:        wdir='.'    elif len(sys.argv)==2:        wdir=sys.argv[1]    else:        print 'usega:find--.py [wdir]'        sys.exit()    tname=1    begin=time.time()    for root,dirs,files in os.walk(wdir):        if files:            sthread=MyThread(root,files,tname)#对每一个目录开启一个线程搜索            threadlist.append(sthread)            sthread.start()            print 'thread-'+str(tname)+'-start search dir:'+root            tname+=1    for t in threadlist:        t.join()    if allDone(threadlist):#统计结果        for i in threadlist:            tenmax.extend(i.tenmax)    if len(tenmax)<MAXC:        tenmax=tenmax[:len(tenmax)]    else:        a=[]        for f in tenmax:            keepTenMax(a,f[0],f[1])        tenmax=a    #打印并输出到parser文件-当前目录下的result.ini文件    print    print '[=========================threads count',len(threadlist),'====================]'    print '[=========================try',count,'files=======================]'    print '[=========================the ',MAXC,' thMax files list===========]'    print    c=1    myrcp=rcp()    myrcp.add_section('Result')    for fname,fsize in tenmax:        size='%.3fMB' % (fsize/1024.0/1024.0)        print '[%d]%s-%s' % (c,fname,size)        myrcp.set('Result','[%d]%s' % (c,fname),size)        c+=1    myrcp.write(open('result.ini','w'))    end=time.time()    usetime=end-begin    print    print '[=============================================================]'    print 'all time:%.3fs' % usetime

评论关闭