Python线程与性能?

5 投票
2 回答
2826 浏览
提问于 2025-04-15 23:47

我需要进行一些比较耗时的操作,比如解析大文件和把一种格式转换成另一种格式。最开始,我是一个接一个地处理这些文件,也就是串行处理,这样做的效率非常低,通常需要90秒以上才能完成。所以我决定使用多线程来提高效率。我为每个文件创建了一个线程,总共用了4个线程。

 for file in file_list:
            t=threading.Thread(target = self.convertfile,args = file)
            t.start()
            ts.append(t)
 for t in ts:
            t.join()

但是让我感到惊讶的是,性能并没有任何改善。现在完成这个任务仍然需要90秒以上。因为这是一个耗时的操作,我本来期待能提高效率的。

2 个回答

2

线程可以让操作系统给你的程序分配更多的CPU核心。如果你的程序是I/O密集型的,这就意味着它的运行速度受限于输入输出系统的速度,而不是CPU的速度。在这种情况下,分配更多的CPU核心并不一定有帮助,因为你还是在等待输入输出系统的响应。

10

在普通的Python解释器下,使用线程并不会让你的程序使用更多的CPU核心,因为有一个叫做全局解释器锁(简称GIL)的东西。

不过,你可以试试多进程模块。这个模块是在Python 2.6中引入的,但也有适用于Python 2.5的版本。

正如MSalters所说,如果你的程序主要是处理输入输出(I/O),那么使用这个模块的效果可能值得商榷。不过,试试看也许会有意想不到的收获 :)

如果你想用这个模块实现你的目标,可以这样做:

import multiprocessing

MAX_PARALLEL_TASKS = 8 # I have an Intel Core i7 :)

pool = multiprocessing.Pool(MAX_PARALLEL_TASKS)

pool.map_async(convertfile, filelist)

pool.close()
pool.join()

重要提示! 你传给map_async的函数必须是可以被序列化的(pickleable)。一般来说,实例方法是不能被序列化的,除非你特别设计成可以序列化的!注意,上面的convertfile是一个函数。

如果你确实需要从convertfile获取结果,也有办法做到。多进程文档页面上的示例会让你更清楚。

撰写回答