我对这个话题非常陌生,所以如果我提出的问题有点琐碎,我很抱歉。我有一个很长的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
。即使它包含在上面的参数列表中。
非常感谢任何类型的帮助。如果你可以推荐一些东西,除了一般的文件,这也很好。谢谢您的帮助。