python多线程分块读取文件


Posted in Python onAugust 29, 2019

本文实例为大家分享了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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
python调用fortran模块
Apr 08 Python
深入学习Python中的装饰器使用
Jun 20 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 Python
Pytorch之view及view_as使用详解
Dec 31 Python
IDLE下Python文件编辑和运行操作
Apr 25 Python
python requests.get带header
May 05 Python
Python嵌入C/C++进行开发详解
Jun 09 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
用sqlalchemy构建Django连接池的实例
Aug 29 #Python
详解Python 字符串相似性的几种度量方法
Aug 29 #Python
python多线程同步之文件读写控制
Feb 25 #Python
python线程中的同步问题及解决方法
Aug 29 #Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 #Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 #Python
深入了解python中元类的相关知识
Aug 29 #Python
You might like
php检测useragent版本示例
2014/03/24 PHP
php实现telnet功能示例
2014/04/08 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
页面间固定参数,通过cookie传值的实现方法
2017/05/31 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
python操作MongoDB基础知识
2013/11/01 Python
Python生成pdf文件的方法
2014/08/04 Python
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
python输出决策树图形的例子
2019/08/09 Python
python nmap实现端口扫描器教程
2020/05/28 Python
python多进程并行代码实例
2019/09/30 Python
Python之指数与E记法的区别详解
2019/11/21 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
主要的Ajax框架都有什么
2013/11/14 面试题
电大自我鉴定
2013/10/27 职场文书
酒店总经理工作职责
2013/12/13 职场文书
音乐专业自荐信
2014/02/07 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
财产分割协议书范本
2014/11/03 职场文书
离婚协议书样本
2015/01/26 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js