[英]Parallelize my python program
我有一个python程序从输入文件中读取一行,进行一些操作并将其写入输出文件。 我有一台四核机器,我想利用它们。 我认为有两种方法可以做到这一点,
我从来没有使用过python mutliprocessing功能,黑客可以告诉哪种方法最好吗?
Python解释器(CPython)的参考实现拥有臭名昭着的“全局解释器锁”(GIL) ,实际上只允许一个线程一次执行Python代码。 因此,多线程在Python中非常有限 - 除非您在C语言扩展中完成释放GIL。
克服此限制的最简单方法是使用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)
同时从多个进程读取同一文件很棘手。 是否可以预先拆分文件?
虽然Python有GIL,但Jython和IronPython都没有这个限制。
还要确保简单的单个进程还没有最大磁盘I / O. 如果确实如此,你将很难获得任何收益。
第一是正确的答案。
首先,创建和管理多个进程比多线程更容易。 您可以使用multiprocessing
模块或pyro
东西来处理细节。 其次,线程需要处理Python的全局解释器锁,这使得它变得更加复杂,即使您是使用Java或C#进行线程处理的专家。 最重要的是,多核机器上的性能比您想象的更难预测。 如果你没有实现和测量两种不同的做事方式,你对哪种方式最快的直觉可能是错误的。
顺便说一句,如果你真的是Java或C#线程专家,那么你可能应该选择使用线程,但是使用Jython
或IronPython
而不是CPython。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.