python多线程分块读取文件
本文实例为大家分享了python多线程分块读取文件的具体代码,供大家参考,具体内容如下
#_*_coding:utf-8_*_ importtime,threading,ConfigParser ''' Reader类,继承threading.Thread @__init__方法初始化 @run方法实现了读文件的操作 ''' classReader(threading.Thread): def__init__(self,file_name,start_pos,end_pos): super(Reader,self).__init__() self.file_name=file_name self.start_pos=start_pos self.end_pos=end_pos defrun(self): fd=open(self.file_name,'r') ''' 该if块主要判断分块后的文件块的首位置是不是行首, 是行首的话,不做处理 否则,将文件块的首位置定位到下一行的行首 ''' ifself.start_pos!=0: fd.seek(self.start_pos-1) iffd.read(1)!='\n': line=fd.readline() self.start_pos=fd.tell() fd.seek(self.start_pos) ''' 对该文件块进行处理 ''' while(self.start_pos<=self.end_pos): line=fd.readline() ''' dosomthing ''' self.start_pos=fd.tell() ''' 对文件进行分块,文件块的数量和线程数量一致 ''' classPartition(object): def__init__(self,file_name,thread_num): self.file_name=file_name self.block_num=thread_num defpart(self): fd=open(self.file_name,'r') fd.seek(0,2) pos_list=[] file_size=fd.tell() block_size=file_size/self.block_num start_pos=0 foriinrange(self.block_num): ifi==self.block_num-1: end_pos=file_size-1 pos_list.append((start_pos,end_pos)) break end_pos=start_pos+block_size-1 ifend_pos>=file_size: end_pos=file_size-1 ifstart_pos>=file_size: break pos_list.append((start_pos,end_pos)) start_pos=end_pos+1 fd.close() returnpos_list if__name__=='__main__': ''' 读取配置文件 ''' config=ConfigParser.ConfigParser() config.readfp(open('conf.ini')) #文件名 file_name=config.get('info','fileName') #线程数量 thread_num=int(config.get('info','threadNum')) #起始时间 start_time=time.clock() p=Partition(file_name,thread_num) t=[] pos=p.part() #生成线程 foriinrange(thread_num): t.append(Reader(file_name,*pos[i])) #开启线程 foriinrange(thread_num): t[i].start() foriinrange(thread_num): t[i].join() #结束时间 end_time=time.clock() print"Costtimeis%f"%(end_time-start_time)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。