运行Python子流程

时间:2011-06-27 18:36:28

标签: python subprocess

所有

我已经阅读了几个关于如何在python中运行子进程的线程,但它们似乎都没有帮助我。这可能是因为我不知道如何正确使用它们。我有几个方法可以同时运行而不是按顺序运行,我认为子进程模块会为我做这个。

def services():
     services = [method1(),
            method2(),
            method3(),  
            mrthod4(),
            method5()]
     return services

def runAll():
    import subprocess
    for i in services():
        proc = subprocess.call(i,shell=True)

这种方法的问题是method1()启动,而method2()直到1完成才开始。我尝试了几种方法,包括在我的服务方法中使用subprocess.Popen []而没有运气。任何人都可以帮我解决如何让方法1-5同时运行的问题吗?

谢谢, 亚当

8 个答案:

答案 0 :(得分:4)

根据Python文档subprocess.call()等待命令完成。您应该直接使用subprocess.Popen对象,这将为您提供所需的灵活性。

答案 1 :(得分:1)

你需要使用&以异步方式执行它们。这是一个例子:

 subprocess.call("./foo1&", shell=True)
 subprocess.call("./foo2&", shell=True)

这就像普通的unix shell一样。

编辑:虽然有多种更好的方法可以做到这一点。请参阅其他答案以获取一些示例。

答案 2 :(得分:1)

答案 3 :(得分:1)

通过说method1(),你正在调用该函数并等待它返回。 (这是一种功能,而不是一种方法。)

如果您只想并行运行一堆重型功能并收集结果,可以使用joblib

from joblib import Parallel, delayed

functions = [fn1, fn2, fn3, fn4]

results = Parallel(n_jobs=4)(delayed(f)() for f in functions)

答案 4 :(得分:1)

subprocess.call()阻止,直到流程完成。

multiprocessing听起来更适合你正在做的事情。

例如:

from multiprocessing import Process

def f1():
    while True:
        print 'foo'

def f2():
    while True:
        print 'bar'

def f3():
    while True:
        print 'baz'

if __name__ == '__main__':
    for func in (f1, f2, f3):
        Process(target=func).start()

答案 5 :(得分:1)

在python 3.2.x中,并发期货模块使这类事情变得非常简单。

答案 6 :(得分:0)

子进程不会使进程异步。您尝试实现的目标可以使用多线程或多处理模块来完成。

答案 7 :(得分:0)

我最近遇到了类似的问题,并解决了这个问题:

from multiprocessing import Pool
def parallelfuncs(funcs, args, results, bad_value = None):
    p = Pool()
    waiters = []
    for f in funcs:
        waiters.append(p.apply_async(f, args, callback = results.append))
    p.close()
    for w in waiters:
        if w.get()[0] == bad_value:
            p.terminate()
    return p

好处是函数 funcs 在args(地图的反面)上并行执行,并返回结果。多处理池使用所有处理器并处理作业执行。

w.get blocks,如果不清楚的话。

对于您的用例,您可以致电

results = []
parallelfuncs(services, args, results).join()
print results