繁体   English   中英

并行化我的python程序

[英]Parallelize my python program

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

  1. 创建n个多个python进程,每个进程处理总记录数/ n
  2. 在单个python进程中为每个输入记录创建n个线程,每个线程处理一个记录。
  3. 在单个python进程中创建n个线程池,每个线程执行一个输入记录。

我从来没有使用过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#线程专家,那么你可能应该选择使用线程,但是使用JythonIronPython而不是CPython。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM