python多线程分块读取文件

yipeiwu_com6年前Python基础

本文实例为大家分享了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中的sort()方法使用基础教程

一、基本形式 sorted(iterable[, cmp[, key[, reverse]]]) iterable.sort(cmp[, key[, reverse]]) &nbs...

python使用matplotlib画柱状图、散点图

python使用matplotlib画柱状图、散点图

本文实例为大家分享了python使用matplotlib画柱状图、散点图的具体代码,供大家参考,具体内容如下 柱状图(plt.bar) 代码与注释 import numpy as n...

使用python对文件中的单词进行提取的方法示例

使用python对文件中的单词进行提取的方法示例

由于需要使用一个纯单词组成的文件,在网上下载到了一个存放单词的文件,但是里面有中文的解释,那就需要做一下提取了。 文本的形式如下: 所见即所得,这个文本是有规律的,每个单词为一行,紧...

Django实现的自定义访问日志模块示例

本文实例讲述了Django实现的自定义访问日志模块。分享给大家供大家参考,具体如下: 在Django默认没有访问日志模块,但是我们可以通过Django的Middleware来实现一个自己...

python opencv根据颜色进行目标检测的方法示例

python opencv根据颜色进行目标检测的方法示例

颜色目标检测就是根据物体的颜色快速进行目标定位。使用cv2.inRange函数设定合适的阈值,即可以选出合适的目标。 建立项目colordetect.py,代码如下: #! /us...