python(35):多線程讀取文件


多線程讀取文件:

# _*_coding:utf-8_*_
import time, threading, ConfigParser

'''
Reader類,繼承threading.Thread
@__init__方法初始化
@run方法實現了讀文件的操作
'''
class Reader(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

    def run(self):
        fd = open(self.file_name, 'r')
        '''
        該if塊主要判斷分塊后的文件塊的首位置是不是行首,
        是行首的話,不做處理
        否則,將文件塊的首位置定位到下一行的行首
        '''
        if self.start_pos != 0:
            fd.seek(self.start_pos-1)
            if fd.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()
            '''
            do somthing
            '''
            self.start_pos = fd.tell()

'''
對文件進行分塊,文件塊的數量和線程數量一致
'''
class Partition(object):
    def __init__(self, file_name, thread_num):
        self.file_name = file_name
        self.block_num = thread_num

    def part(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
        for i in range(self.block_num):
            if i == self.block_num-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.close()
        return pos_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()
    #生成線程
    for i in range(thread_num):
        t.append(Reader(file_name, *pos[i]))
    #開啟線程
    for i in range(thread_num):
        t[i].start()
    for i in range(thread_num):
        t[i].join()
    #結束時間
    end_time = time.clock()
    print "Cost time is %f" % (end_time - start_time)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM