2011-06-27 57 views
1

全部,運行一個Python子進程

我已經閱讀了關於如何在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同時運行嗎?

感謝, 亞當

回答

1

在蟒蛇3.2.x中,併發期貨模塊,使這種東西也很方便。

4

根據Python文檔subprocess.call()等待命令完成。您應該直接使用subprocess.Popen對象,這將爲您提供所需的靈活性。

1

您需要使用&來異步執行它們。這裏是一個例子:

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

這就像普通的unix shell一樣。

編輯:雖然有多個,更好的方法來做到這一點。查看其他答案的一些例子。

0

子流程不會使流程異步。您想要實現的功能可以使用多線程或多處理模塊完成。

1

通過說method1(),您正在調用該函數並等待它返回。 (這是一個功能,而不是一個方法。)

如果你只是想運行一束平行重載函數,並收集他們的結果,你可以使用joblib

from joblib import Parallel, delayed 

functions = [fn1, fn2, fn3, fn4] 

results = Parallel(n_jobs=4)(delayed(f)() for f in functions) 
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() 
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。得到塊,如果不明確。

對於你的使用情況,您可以撥打

results = [] 
parallelfuncs(services, args, results).join() 
print results 
相關問題