首页 > 解决方案 > Python并行调用多个函数并合并结果

问题描述

我必须写一份工作来对给定的文档进行不同类型的分析。我知道我可以按顺序进行,即逐个调用每个解析器。下面给出了一个非常高级的脚本结构

def summarize(doc):
    pass
def LengthCount(doc):
    pass
def LanguageFinder(doc):
    pass
def ProfanityFinder(doc):
    pass

if __name__ == '__main__':
    doc = "Some document"
    smry = summarize(doc)
    length = LengthCount(doc)
    lang = LanguageFinder(doc)
    profanity = ProfanityFinder(doc)

    # Save sumary, length, language, profanity information in database

但是为了提高性能,我认为这些任务可以并行运行。我该怎么做。在 Python 尤其是 3.x 版本中有哪些可能的方法。一个解析器(模块)很可能比其他解析器花费更多的时间,但总的来说,如果它们可以并行运行,它们将提高性能。最后,如果在 Python 中不可能,也欢迎使用任何其他语言。

标签: pythonpython-3.xparallel-processing

解决方案


在 Python 中,您有一些并发/并行性选项。有threading允许您在多个逻辑线程中执行代码的multiprocessing模块和允许您生成多个进程的模块。还有一个concurrent.futures模块为这两种机制提供 API。

如果您的进程受 CPU 限制(即,您在整个过程中以 100% 的可用 CPU 运行 Python - 请注意,如果您有多核或超线程机器,这不是 100% CPU),您不太可能看到很多好处从线程,因为这实际上并没有并行使用多个 CPU 线程,它只是允许一个在第一个等待 IO 时从另一个接管。多处理可能对您更有用,因为这允许您使用多个 CPU 线程运行。您可以使用 Process 类在自己的进程中启动每个函数:

import multiprocessing

#function defs here 

p = multiprocessing.Process(target=LengthCount, args=(doc,))
p.start()
# repeat for other processes

您将需要调整代码以使函数返回到共享变量(或直接写入数据库),而不是直接返回结果,这样您就可以在过程完成后访问它们。


推荐阅读