所以我有两个python脚本。第一个是扫描数千个文件的解析器,第二个是在数百个单独目录上分叉扫描的调度程序。我的问题是:
我的磁盘资源有限,每次扫描使用大约1GB的本地sqlite3存储空间。我需要限制进程数量,以便在最大进程数运行时,我不会收到磁盘IO错误,这是我一直得到的。
我尝试使用以下代码来分叉扫描并将进程保持在8,但是当我查看我的临时目录(存储临时本地文件的位置)时,实际上有超过8个文件显示我我没有正确地限制进程(我在扫描完成后使用os.remove来删除临时文件)。
这是我的执行扫描方法,只使用格式正确的命令
来分离进程def execute_scan(cmd):
try:
log("Executing "+ str(cmd))
subprocess.call(cmd, shell=False)
except Exception as e:
log(e)
log(cmd)
这是我的main方法,其中getCommand(obj)将对象中的数据转换为命令数组。
tasks = [getCommand(obj) for obj in scanQueue if getCommand(obj) is not None]
multiprocessing.Pool(NUM_PROCS).map(execute_scan, tasks)
我可以使用任何可以获得的建议,因为我正在处理大量数据而且我的磁盘不是那么大。
非常感谢!
答案 0 :(得分:0)
gevent.pool.Pool
可能是适合您的解决方案。因为gevent使用greenlet进行并发操作,并且一次只能运行一个greenlet。
在您的情况下,首先,将池大小设置为正确的数字,这意味着最多只有一些greenlet可以执行一些I / O操作。然后将执行扫描任务的功能转换为greenlet,并将其添加到要由 hub greenlet安排的池中。
以下是有关gevent.pool.Pool
用法的简要教程答案 1 :(得分:0)
虽然我可能已经在这个应用程序上使用了多处理,但事实证明,因为sqlite3数据库的IO是瓶颈,多处理实际上正在减慢goncalopp预测的速度。