使用不同的线程读取文件

时间:2013-10-19 21:03:14

标签: python multithreading

我正在尝试使用Python读取和修改许多文件的每一行。每个文件都有数千到数十万行,因此每个文件只在处理后才处理另一个文件。我正在尝试阅读以下文件:

csvReader = csv.reader(open("file","r")
for row in csvReader:
    handleRow(row)

我想使用多线程来使用不同的并行线程读取每个文件,以节省时间。任何人都可以指出它是否有用以及如何实现它?

2 个答案:

答案 0 :(得分:2)

它可能有用也可能没用 - 如果所有文件都在同一个驱动器上,并且你已经尽可能快地推动驱动器,那么多路复用只能减慢速度。但是,如果你没有最大化你的I / O,它会加速。

就如何做而言,这是微不足道的。将代码包装在一个带有路径名的函数中,然后使用concurrent.futures.ThreadPoolExecutor或multiprocessing.dummy.Pool,它是一行代码,用于将函数映射到整个可迭代的路径名:

with ThreadPoolExecutor(4) as executor:
    executor.map(func, paths)

还有一件事:如果你不能最大化I / O的原因是因为你在每一行上做了太多的CPU工作,那么线程在Python中就无济于事了(因为GIL),但是你可以只使用进程 - 完全相同的代码,但使用ProcessorPoolExecutor。

答案 1 :(得分:1)

可能你的瓶颈是I / O,所以多线程无济于事;无论如何,很容易尝试:下面的代码详细说明当前目录中的所有文件,一个文件的线程,通过将给定的字符串函数应用于每一行并在给定路径上写入新文件。

from threading import Thread
from os import listdir
from os.path import basename, join, isfile

class FileChanger(Thread):
     def __init__(self, sourcefilename, rowfunc, tgpath):
         Thread.__init__(self)
         self.rowfunc = rowfunc
         self.sfname = sourcefilename
         self.tgpath = tgpath

     def run(self):
         tgf = open(join(self.tgpath, basename(self.sfname)), 'w')
         for r in open(self.sfname):
             tgf.write(self.rowfunc(r))
         tgf.close()

# main #
workers = [FileChanger(f, str.upper, '/tmp/tg') \
                for f in listdir('.') if isfile(f)]
for w in workers:
    w.start()
for w in workers:
    w.join()