python多线程分块读取文件

作者:美如画是我 时间:2023-10-29 18:48:51 

本文实例为大家分享了python多线程分块读取文件的具体代码,供大家参考,具体内容如下


# _*_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)

来源:https://blog.csdn.net/onlyforr/article/details/52094581

标签:python,多线程,读取文件
0
投稿

猜你喜欢

  • Django实现视频播放的具体示例

    2022-11-04 22:26:35
  • Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    2024-01-26 16:33:51
  • jsp/javascript打印九九乘法表代码

    2024-03-23 02:23:17
  • 跟老齐学Python之关于循环的小伎俩

    2022-07-20 07:03:36
  • 对Golang import 导入包语法详解

    2024-02-20 19:10:28
  • python使用ddt过程中遇到的问题及解决方案【推荐】

    2021-08-25 09:20:44
  • 解决PyCharm的Python.exe已经停止工作的问题

    2021-03-30 18:55:34
  • Windows下安装python2.7及科学计算套装

    2023-05-28 13:35:19
  • Python 并行化执行详细解析

    2021-09-23 22:20:52
  • pygame实现键盘的连续监控

    2023-09-26 11:17:10
  • 一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)

    2012-08-21 10:37:37
  • python解决12306登录验证码的实现

    2023-05-29 10:28:35
  • Python flask框架端口失效解决方案

    2021-02-19 23:48:46
  • Python 关于反射和类的特殊成员方法

    2021-10-16 19:30:13
  • 使用babel-plugin-import 实现自动按需引入方式

    2024-04-27 16:00:42
  • 打印出python 当前全局变量和入口参数的所有属性

    2022-09-01 07:06:51
  • Python中的推导式使用详解

    2022-10-30 00:42:49
  • Django执行python manage.py makemigrations报错的解决方案分享

    2021-05-23 06:58:05
  • 解决Python print输出不换行没空格的问题

    2021-03-21 11:05:57
  • 在 git 中取消 __pycache__ 文件的方法

    2022-09-14 20:00:17
  • asp之家 网络编程 m.aspxhome.com