一、思路
- 分块读取文件的所有内容,按块为单位存入到队列中(块的大小=文件的总行数/线程数)
- 每个线程从队列中读数据(当然单位是原来的块)
如何实现分块读???
- 定义一个列表A,该列表存储每一个块的起始和终止位置。
- 根据列表A的元素(元素为列表,存储每一个块的起始和终止位置),读取文件,并将内容存储至队列(该队列为全局变量)中。
全部代码
import threading
import time
import queue
class Reader(threading.Thread):
def __init__(self,Thread_id):
super(Reader, self).__init__()
self.Thread_id=Thread_id
def run(self):
global q
temp_list=q.get()
for text in temp_list:
colums=text.split('\n')
print ("Thread_id",self.Thread_id,' get了:',colums)
class PartionFile:
def __init__(self,file_name,thread_num):
self.file_name=file_name
self.block_num=thread_num
def partqueue(self):
pos_list=[]
file_size=self.getLines() #
block_size=file_size/self.block_num
global q
start_pos=0
for i in range(self.block_num): #总共需记录线程数个位置对
if i==self.block_num-1: #如果是文件的最后一块内动,则其end_pos=file_size-1
end_pos=file_size-1
pos_list.append((start_pos,end_pos))
break
end_pos=start_pos+block_size-1
if end_pos>=file_size:
end_pos=file_size-1
if start_pos>=file_size:
break
pos_list.append((start_pos, end_pos))
start_pos=end_pos+1
fd=open(self.file_name)
for pos_item in pos_list: #根据位置对读源文件并把文件内容存储到队列中
temp_text=[]
start=pos_item[0]
end=pos_item[1]
while start<=end:
text=fd.readline().strip('\n')
temp_text.append(text)
start=start+1
q.put(temp_text)
fd.close
def getLines(self): #获取一个文件有多少行
count=0
fo=open(self.file_name,'r')
for line in fo.readlines():
count=count+1
# print (count)
fo.close()
return count
if __name__=='__main__':
file_name='sing.txt'
q = queue.Queue()
thread_num=4
p=PartionFile(file_name, 4)
p.partqueue()
t=[]
for i in range(thread_num):
t.append(Reader(i))
for i in range(thread_num):
t[i].start()
for i in range(thread_num):
t[i].join()
网友评论