python - 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 中不可能,也欢迎使用任何其他语言。
解决方案
在 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
您将需要调整代码以使函数返回到共享变量(或直接写入数据库),而不是直接返回结果,这样您就可以在过程完成后访问它们。
推荐阅读
- javascript - Javascript If-statement问题理解
- java - 问题是当程序执行 else 时,当密码和用户名为真时。关于它的任何想法?
- sql - Flink SQL:Outer Join with Group By 给出了意外的输出
- git - 纱线说“模式试图在同一个目的地拆包”
- javascript - 渲染时如何有效地截断其中包含html标签的文本?
- typescript - ESlint 不适用于带有打字稿的 .vue 文件
- php - 无法连接,无法与服务器建立连接
- javascript - 如何使用 Laravel 后端和 Vue 前端从数据库中获取数据?
- jquery - 从linkedin Sales Navigator 获取元数据
- angular - 如何动态填充 FormGroup?