python并行Popen

2024-05-28 19:42:54 发布

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

我整晚都在想这个。。。在

makeflags = ['--prefix=/usr','--libdir=/usr/lib']
rootdir='/tmp/project'
ps = set()

def configModule(m):
    print m
    return Popen(["./autogen.sh"] + makeflags, cwd=rootdir+"/"+m)

for module in ['mod1','mod2','mod3' ... 'mod10']:
    ps.add(configModule(module))

os.wait()

我希望它能启动10个进程并执行/自动发电机平行的。然而,我观察到的是,最初的几个configModule似乎在函数被调用后立即退出。我只看到“print m”语句,但看不到的实际输出/汽车发电机在“mod1”内。然而,大约在mod4之后,代码开始并行运行。我可以看到CPU利用率很高,而且输出是在不同的模块文件夹中生成的。在

你知道为什么前几个模块没有产生吗/汽车发电机结果呢?在

如果我以串行方式运行此代码(即使用subprocess.call而不是Popen)它工作正常。在


Tags: 模块代码prefixusr汽车发电机psmodule
2条回答

与da虚拟系统调用类似的构建程序按预期工作:

from subprocess import *

makeflags = [' prefix=/usr',' libdir=/usr/lib']
rootdir='/tmp/project'
ps = dict()

def configModule(m):
    print m
    p = Popen("echo start %s; sleep %d; echo finish %s" % (m, 10-m, m), shell=True)
    #p.m = m
    return p

for module in range(10):
    ps[configModule(module)] = module

while ps:
    done = set()
    for p in ps:
        s = p.poll()
        if s is not None:
            print "Module %d: %d" % (ps[p], s)
            done.add(p)
    for p in done:
        del ps[p]
#os.wait()

您确定输出确实丢失了,还是只是延迟了?在

顺便说一句:

^{pr2}$

更优雅。。。在

你的代码对我有用,应该启动所有进程。你没有给我们太多的工作:什么行为不同?在

您没有重定向粘贴的代码中的输出,因此您可能看到childs的stderr流。但有一点是:

os.wait()

…将只等待1个进程。您可能希望使用来自Popen的返回值,并对每个子进程调用wait或{}。然后,您可以另外使用返回值来确保它们都成功地消亡:

^{pr2}$

如果一切正常,希望它们都是0。在

相关问题 更多 >

    热门问题