限制Popen()调用

2024-04-20 04:39:46 发布

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

在初始Popen解析之前用Popen()启动过多进程有多危险?在

我正在处理一个充满PDF的目录。我迭代每个文件并使用外部调用做两件事。在

首先,我从基于Xpdf的pdftohtml工具获得了一个html表示(pdfminer太慢了)。这样只输出第一页:

html = check_output(['pdftohtml.exe','-f','1','-l','1','-stdout','-noframes',pdf])

然后,如果我的条件得到满足(我确定它是正确的文档),我调用tabula extractor来提取一个表。与检查文档相比,这是一个缓慢/长时间运行的过程,可能只在1/20个文件上发生。在

如果我只做call(['jruby', 'C:\\jruby-1.7.4\\bin\\tabula', .....]),我会花很长时间等待提取完成,同时我可以检查更多的文件(我有4个内核和16gb的ram,表格似乎不是多线程的)。在

因此,我使用Popen()来避免阻塞。在

^{pr2}$

我不关心返回值(tabula正在创建一个csv文件,因此我可以随时查看它是否创建成功)。这样做意味着我可以继续在后台检查文件,并根据需要启动更多的表格进程(同样,只有大约1/20)。在

这是可行的,但它会被积压,最终一次运行大量的表格进程。所以我的问题是: 这不好吗?它会让电脑在其他方面变慢,但只要它不崩溃,并且能以最快的速度工作,我并不介意(所有4个内核始终保持在100%,但内存使用量不会超过5.5GB,因此它似乎受CPU限制)。在

如果它是坏的,什么是正确的方法来改善它?有没有一种方便的方法可以说,将tabla进程排队,这样每个内核总是有1-2个运行,但我不想一次处理30个文件?在


Tags: 文件方法文档目录pdf进程html内核
1条回答
网友
1楼 · 发布于 2024-04-20 04:39:46

Is there a convenient way to say, queue up tabula processes so there are always 1-2 running per core, but I am not trying to process 30 files at once?

是的,^{}模块就是这样做的。在

import multiprocessing
import subprocess

def process_pdf(path):
    subprocess.call(['jruby', 'C:\\jruby-1.7.4\\bin\\tabula', path, ...])

pool = multiprocessing.Pool(3)      # 3 processes
results = []
for path in search_for_files():
    results.append(pool.apply_async(process_pdf, [path]))
for result in results:
    result.wait()

相关问题 更多 >