我不得不进行繁重的I / O绑定操作,即解析大文件并从一种格式转换为其他格式。最初我曾经连续做过,即一个接一个地解析..!性能非常差(使用时间超过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秒以上才能完成任务。由于这是I / O绑定操作,我原本期望提高性能。
答案 0 :(得分:10)
在通常的Python解释器下,由于global interpreter lock(又称GIL),线程不会为你的程序分配更多的CPU内核。
multiprocessing模块可以帮助你。 (请注意,它是在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
取回结果,那么也有办法。多处理文档页面上的示例应该澄清。
答案 1 :(得分:2)
线程允许操作系统为您的程序分配更多CPU内核。如果它受I / O限制,则意味着速度受I / O系统速度而不是CPU速度的限制。在这些情况下,分配更多CPU内核并不一定有帮助 - 您仍在等待I / O子系统。