我有一个脚本,它将包含目录的文件解析为其他文件,必须打开并读取搜索关键字。 由于文件数量在增长,我希望启用多处理以减少完成作业所需的时间。
我正在考虑让父进程解析包含目录的文件,并使用子进程来获取其他文件。由于父级需要在创建子级之前获取数据,因此它将是一种阻塞体系结构(父级必须在调用子级之前读取所有文件),而我想向其中一个子级发送包含目录的列表。每100个结果。
因此,父级继续解析文件,而子级同时工作以查找关键字。
我怎么能这样做? 如果您需要更多解释,请问我,我会告诉您更多。
感谢。
答案 0 :(得分:3)
我正在考虑让父进程解析包含目录的文件,并使用子进程来获取其他文件。
目录是名称。父解析列表并为每个子提供目录 name 。对?然后孩子读取目录中的文件。
由于父级需要在创建子级之前获取数据,因此它将是一种阻塞架构(父级必须在调用子级之前读取所有文件),
庵。孩子不读取目录中的文件?在上面,它表示孩子 读取文件。父母读取大量数据并将其推送给孩子们是愚蠢的。
虽然我想向其中一个孩子发送包含目录的列表,每100个结果。
好。这是不同的。现在,您希望父级读取目录名称,读取一批100个文件名并将文件名发送给子级。好的。这比阅读所有数据都要愚蠢。现在它只有100个名字。
因此,父级继续解析文件,而子级同时工作以查找关键字。
好。但是你完全错过了并行处理的机会。
仔细阅读multprocessing
模块。
你想要的是两个队列和两种工人。
您的应用程序将构建两个队列。它将构建一个源进程,一个“获取批处理”工作进程池和一个“获取文件”工作进程池。
源。这个过程(基本上)是一个读取原始“包含目录的文件”的函数。并将每个目录名称放入“获取批处理”队列。
获取批处理。这是一个流程池。每个进程都是一个从“获取批处理”队列中获取条目的函数。这是目录名称。然后它读取目录并将100个文件名的元组排入“get files”队列。
获取文件。这是一个流程池。每个进程都是一个从“获取文件”队列中获取条目的函数。这是一个包含100个文件的元组。然后它打开并读取这100个文件,与他们一起做上帝知道的事情。
多处理模块的想法是使用所有工作池,这些工作池都从队列中获取任务并将其结果放入另一个队列。这些工作人员全部同时运行。