Python线程与性能?
我需要进行一些比较耗时的操作,比如解析大文件和把一种格式转换成另一种格式。最开始,我是一个接一个地处理这些文件,也就是串行处理,这样做的效率非常低,通常需要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
获取结果,也有办法做到。多进程文档页面上的示例会让你更清楚。