这里参考了这篇文章 https://gist.github.com/friskfly/4412375 ,然后加上自己的理解和应用, 整理如下:
# -*- coding: utf-8 -*-
import os,time
import threading
import ConfigParser
rlock = threading.RLock()
curPosition = 0 #初始化位置为文件其实位置
class Reader(threading.Thread):
def __init__(self, res):
self.res = res
super(Reader, self).__init__() #调用子类构造函数获得文件大小
def run(self): #线程函数
global curPosition
fstream = open(self.res.fileName, 'r') #打开文件
while True:
rlock.acquire()
startPosition = curPosition #每次更新起始位置
if(startPosition + self.res.fileSize/threadNum) < self.res.fileSize: # 这里,例如开了10个线程,就将文件分为10块,每个线程负责一块
curPosition = endPosition = (startPosition + self.res.fileSize/threadNum)
else:
curPosition = endPosition = self.res.fileSize
rlock.release()
if startPosition == self.res.fileSize:
break
elif startPosition != 0: #这种情况适用于除了第一个文件块之后的文件块,因为分割后,第一块以后的文件块的起始位置肯定比0大
fstream.seek(startPosition) #找到那个位置
line = fstream.readline() #由于这一行在上一个循环中已经读取了,所以先读一行,把这行跳过
pos = fstream.tell() #获取当前的位置
while pos <= endPosition:
line = fstream.readline()
'''
对每一行进行处理
'''
pos = fstream.tell() #每处理一行,更新坐标
if pos ==self.res.fileSize: #如果读到了文件末尾,跳出循环
break
fstream.close()
class Resource(object):
def __init__(self, fileName):
self.fileName = fileName
self.getFileSize()
#计算文件大小
def getFileSize(self):
fstream = open(self.fileName, 'r')
fstream.seek(0, 2) #这里0代表文件开始,2代表文件末尾
self.fileSize = fstream.tell()
fstream.close()
if __name__ == '__main__':
#读取配置文件,配置文件里面可以写一些文件的信息,这样方便修改
config = ConfigParser.ConfigParser()
config.readfp(open('conf.ini'))
fileName = config.get("info","fileRead")
starttime = time.clock()
#线程数
threadNum = int(config.get("info","threadNum"))
#文件
res = Resource(fileName)
threads = []
#初始化线程
for i in range(threadNum):
rdr = Reader(res)
threads.append(rdr)
#开始线程
for i in range(threadNum):
threads[i].start()
#结束线程
for i in range(threadNum):
threads[i].join()
print(time.clock() - starttime)
fo.close()
配置文件代码:
[info]
threadNum = 10
fileRead = input_file