Python:多进程池中的强制num进程

时间:2013-12-09 17:39:03

标签: python multithreading multiprocessing

所以我有两个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)

我可以使用任何可以获得的建议,因为我正在处理大量数据而且我的磁盘不是那么大。

非常感谢!

2 个答案:

答案 0 :(得分:0)

gevent.pool.Pool可能是适合您的解决方案。因为gevent使用greenlet进行并发操作,并且一次只能运行一个greenlet。

在您的情况下,首先,将池大小设置为正确的数字,这意味着最多只有一些greenlet可以执行一些I / O操作。然后将执行扫描任务的功能转换为greenlet,并将其添加到要由 hub greenlet安排的池中。

以下是有关gevent.pool.Pool

用法的简要教程

答案 1 :(得分:0)

虽然我可能已经在这个应用程序上使用了多处理,但事实证明,因为sqlite3数据库的IO是瓶颈,多处理实际上正在减慢goncalopp预测的速度。