• 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) != '
    ':
                    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)
  • 相关阅读:
    39岁了,我依旧要谈梦想
    ASP原码加密工具介绍
    extjs_07_combobox&amp;tree&amp;chart
    JS0基础学习笔记(1)
    AndroidUI组件之ActionBar
    Sourcetree 更新git账号密码
    iOS人脸识别核心代码(备用)
    ios 中的tintColor
    appStore上传苹果应用程序软件发布
    iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单
  • 原文地址:https://www.cnblogs.com/lovychen/p/6561543.html
Copyright © 2020-2023  润新知