在Python apply_async中丢失排队的任务

时间:2013-11-03 04:47:05

标签: python queue multiprocessing executable

我正在尝试编写一个包装器,它使用不同的输入文件运行另一个程序。程序(我无法控制,但需要使用)需要与输入文件在同一目录下运行。到目前为止,我的方法是使用OS模块来更改/创建目录结构,使用apply-async来运行给定子目录的程序,并且apply-async中的每个子项更改目录,创建文件,以及前8个进程运行成功(我有8个虚拟核心)

但是,我排队了100个这样的过程(他们运行模拟需要几分钟,我正在寻求优化)。我在运行的外部可执行文件上使用“call”。我认为一切都很顺利,但是在第8次模拟运行之后,一切都停止了,我检查了0个进程正在运行。好像队列忘记了其他进程。

我该怎么做才能解决这个问题?我知道我的内存只有8GB的内存大约300 MB。

我是否需要自己尝试实现某种类型的队列,等待模拟可执行文件的退出代码?

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

也许比什么都好。这显示了使用apply_async()的正确方法,并证明了 - 是的 - 创建比进程更多的任务没有问题。我告诉你这与你正在做的有什么不同,但我不知道你在做什么; - )

import multiprocessing as mp

def work(i):
    from time import sleep
    sleep(2.0 if i & 1 else 1.0)
    return i*i

if __name__ == "__main__":
    pool = mp.Pool(4)
    results = [pool.apply_async(work, (i,)) for i in range(100)]
    results = [r.get() for r in results]
    print len(results), results
    pool.close()
    pool.join()