本文实例为大家分享了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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
我必须以2KB的块读取文件,并在这些块上执行一些操作。现在我实际上陷入困境的地方是,当数据需要线程安全时。根据我在在线教程和 StackOverflow 答案中看到的内容,我们定义了一个工作线程,并重写了它的运行方法。run 方法使用队列中的数据,我们将其作为参数传递,并且包含实际数据。但是要用数据加载该队列,我必须按顺序遍历文件,这消除了并行性。我希望多个线程以并行方式读取文件。因此,我必须仅在
问题内容: 我仍在全神贯注地了解Java中并发的工作方式。我知道(如果您订购的是OO Java 5并发模型)则分别实现a 或with 或or 方法,并且它应该使您尽可能多地并行实现该方法。 但是我仍然不了解Java并发编程的内在知识: 一个是怎样的方法分配给执行工作的同时适量的? 作为一个具体的例子,如果我有一个I / O绑定的方法,该方法将从本地系统上的文件中读取Herman Melville的
前面章节中,我们学会了使用 open() 和 read()(或者 readline()、readlines() )组合,来读取单个文件中的数据。但在某些场景中,可能需要读取多个文件的数据,这种情况下,再使用这个组合,显然就不合适了。 庆幸的是, Python 提供了 fileinput 模块,通过该模块中的 input() 函数,我们能同时打开指定的多个文件,还可以逐个读取这些文件中的内容。 f
本文向大家介绍Python fileinput模块如何逐行读取多个文件,包括了Python fileinput模块如何逐行读取多个文件的使用技巧和注意事项,需要的朋友参考一下 Python 提供了 fileinput 模块,通过该模块中的 input() 函数,我们能同时打开指定的多个文件,还可以逐个读取这些文件中的内容。 fileinput 模块中 input() 该函数的语法格式如下: fil
本文向大家介绍python多线程同步之文件读写控制,包括了python多线程同步之文件读写控制的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python多线程同步之文件读写控制的具体代码,供大家参考,具体内容如下 1、实现文件读写的文件ltz_schedule_times.py 2.1、不加锁对文件进行多线程读写。file_lock.py 得到结果: 文件写入结果: 以上结果可以看
有一天我在想线程,我开始怀疑如果多个线程根本不修改它,它们是否可以访问相同的信息(不使用同步(锁))。 一个例子是10个线程读取1个类,由于我们称之为M的线程,这些线程调用访问器从这个类中获取信息,但不以任何方式修改信息。 同时,线程M偶尔会修改这个类中的数据(这将改变10个线程在“重启”后正在进行的计算结果) 会有问题吗?问题是其中一个线程将线程M修改过的信息“放回”。最重要的是,是否有一天访问