如何解决Python中只有部分代码的并行处理?

时间:2017-11-27 18:48:46

标签: python parallel-processing python-multiprocessing

我对这个话题非常陌生,所以如果我提出的问题有点琐碎,我很抱歉。我有一个很长的main函数,并且只希望并行化一部分。

main函数有什么作用?首先,它从给定路径读取目录内容,将所有文件收集到列表中,一个接一个地打开它们并根据先前定义的模式解析其内容,将获得的数据分组在一起,将其插入数据库,最后向屏幕输出一些关于插入数据和数据类型的消息。

为什么我要进行并行处理?当我运行代码时,我发现它非常慢。 (处理一个文件通常需要7到8秒,因为我有几千个这样的文件,这是非常多的。)最耗时的过程是:解析,分组数据和插入数据库。所以我的想法是把它们放到一个新函数中(因为我从Python文档中学到了要并行化的进程通常放在一个新函数中)并尝试让CPU并行处理它。所以实际上我想要并行处理的是一个遍历目录的所有文件的长循环。这部分代码位于main的中间。

我是如何实现它的?我导入了multiprocessing.Pool库。虽然我不知道如何处理if __name__ == '__main__'部分。我已经在文档中看到了这种结构(例如:1),没有这个,读取池就无法正常工作。但所有这些示例都只是纯多处理示例,不包含任何其他进程。这就是为什么我很困惑如何前进的原因。

我想要并行化的唯一部分是一个名为toParallel()的方法,它由上述过程组成,即:解析,分组和插入。

我有两个想法:1)摆脱我的main函数并用if __name__ == '__main__'结构替换它。没有真正的工作,并导致需要纠正的大量错误。 2)保持main,然后在此之后创建if __name__ == '__main__',并在其块内写入池(请参阅下面的代码片段)。在main之前调用if __name__ == '__main__'。这并没有抛出错误,所以我认为这可能是正确的方向。但是当我尝试打印outdata的内容时,我还没有任何结果:print(outdata.get())

if __name__ == '__main__':
    pool = Pool(4)
    outdata = pool.map(toParallel, (database, fileList,))
    pool.join()
    pool.close()

编辑但这显然不正确,因为我的main功能在插入完成后仍在继续。如上所述,有一些控制台输出消息基于有关新插入(或未插入)数据的信息。但是如果我从最后调用我的toParallel函数,编译器将不会提供有关main函数结束的有意义数据。

编辑2 对于ShadowRanger的推荐,我在main内的以下代码段中输入了我要并行化的进程位置:

with Pool() as pool:
    results = pool.map(toParallel, (database, fileList))
    pool.join()
    pool.close()

但它返回了以下错误:TypeError: toParallel() missing 1 required positional argument: fileList。即使它包含在上面的参数列表中。

非常感谢任何类型的帮助。如果你可以推荐一些东西,除了一般的文件,这也很好。谢谢您的帮助。

0 个答案:

没有答案