如何解决Python中只对一部分代码进行并行处理的问题?

2024-05-20 14:09:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我对这个话题还很陌生,所以如果我问的是一些琐碎的问题,我很抱歉。我有一个长的main函数,只想并行化其中的一部分。你知道吗

函数main做什么?它首先从给定路径读入目录的内容,将所有文件收集到一个列表中,依次打开,并根据先前定义的模式解析其内容,将获得的数据分组,插入数据库,最后向屏幕输出有关数字和类型的消息插入的数据。你知道吗

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

我想如何实现它?我导入了multiprocessing.Pool库。尽管我不知道如何处理if __name__ == '__main__'部分。我在文档中见过这种结构(例如:1),没有这种结构,读池就不能正常工作。但所有这些例子都只是纯粹的多进程例子,不包含任何其他进程。这就是为什么我对如何前进感到困惑。你知道吗

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

我有两个想法:1)去掉我的main函数,用if __name__ == '__main__'结构替换它。没有真正的工作,并造成了大量的错误,需要纠正。 2) 要保留main,还要在此之后创建if __name__ == '__main__',并在其块内写入池(请参见下面的代码片段)。在if __name__ == '__main__'之前调用main。这没有引发错误,所以我想这可能是正确的方向。但是当我试图通过:print(outdata.get())打印出outdata的内容时,我还没有任何结果。你知道吗

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。即使它包含在上面的参数列表中。你知道吗

任何形式的帮助都是非常感谢的。如果你能推荐一些东西来阅读,除了一般的文档,那也没关系。谢谢你的帮助。你知道吗


Tags: 文件数据函数代码name文档内容if