我有一个python程序,它从输入文件中读取一行,进行一些操作并将其写入输出文件。我有一台四核机器,我想利用它们。我认为有两种选择,
我从未使用过python mutliprocessing功能,黑客可以告诉哪种方法最好吗?
答案 0 :(得分:4)
Python解释器(CPython)的参考实现拥有臭名昭着的"Global Interpreter Lock" (GIL),实际上只允许一个线程一次执行Python代码。因此,Python中的多线程非常有限 - 除非您在释放GIL的C扩展中完成繁重工作。
克服此限制的最简单方法是使用multiprocessing
模块。它具有与threading
类似的API,并且非常简单易用。在你的情况下,你可以像这样使用它(假设操作是困难的部分):
import multiprocessing
def process_line(line):
# This function is executed in your worker processes. Manipulate the
# line and return the results.
return manipulate(line)
if __name__ == '__main__':
with open('input.txt') as fin, open('output.txt', 'w') as fout:
# This creates a pool of N worker processes, where N is the number
# of CPUs in your machine.
pool = multiprocessing.Pool()
# Let the workers do the manipulation and write the results to
# the output file:
for manipulated_line in pool.imap(process_line, fin):
fout.write(manipulated_line)
答案 1 :(得分:0)
同时从多个进程中读取同一个文件很棘手。是否可以预先拆分文件?
虽然Python有GIL,但Jython和IronPython都没有这个限制。
还要确保简单的单个进程还没有最大磁盘I / O.如果有的话,你将很难获得任何东西。
答案 2 :(得分:0)
第一是正确答案。
首先,创建和管理多个进程比多线程更容易。您可以使用multiprocessing
模块或类似pyro
的内容来处理详细信息。其次,线程需要处理Python的全局解释器锁,这使得它变得更加复杂,即使您是使用Java或C#进行线程处理的专家。最重要的是,多核机器上的性能比您想象的更难预测。如果你没有实现和测量两种不同的做事方式,你对哪种方式最快的直觉可能是错误的。
顺便说一句,如果你真的是Java或C#线程专家,那么你可能应该使用线程,但是使用Jython
或IronPython
而不是CPython。