并行化我的python程序

时间:2011-03-30 07:43:42

标签: python multicore multiprocessing

我有一个python程序,它从输入文件中读取一行,进行一些操作并将其写入输出文件。我有一台四核机器,我想利用它们。我认为有两种选择,

  1. 创建n个多个python进程,每个进程处理一个记录总数/ n
  2. 在每个输入记录的单个python进程中创建n个线程,每个线程处理一条记录。
  3. 在单个python进程中创建n个线程池,每个线程执行一个输入记录。
  4. 我从未使用过python mutliprocessing功能,黑客可以告诉哪种方法最好吗?

3 个答案:

答案 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#线程专家,那么你可能应该使用线程,但是使用JythonIronPython而不是CPython。