2013-07-29 53 views
1

我正在做幾個進程。每個過程都會返回一些結果。我將如何收集這些過程的結果。從python不同進程中收集結果

task_1 = Process(target=do_this_task,args=(para_1,para_2)) 
task_2 = Process(target=do_this_task,args=(para_1,para_2)) 

do_this_task返回一些結果。我想收集這些結果並將它們保存在一些變量中。

+0

使用'multiprocessing'模塊中的'apply_async',如[這裏]所述(http://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers) – mtadd

回答

0

如果進程是外部腳本,則嘗試使用subprocess模塊。但是,您的代碼表明您想要並行運行功能。爲此,請嘗試multiprocessing模塊。從this回答一些代碼的利用多重的具體細節:

def foo(bar, baz): 
    print 'hello {0}'.format(bar) 
    return 'foo' + baz 

from multiprocessing.pool import ThreadPool 
pool = ThreadPool(processes=1) 

async_result = pool.apply_async(foo, ('world', 'foo')) # tuple of args for foo 

# do some other stuff in the other processes 

return_val = async_result.get() # get the return value from your function. 
+0

任何downvote的原因? – rlms

1

所以現在我建議,因爲它處理了不少給你,你應該使用Python multiprocessing模塊的游泳池。你能詳細說明你在做什麼,爲什麼你想直接使用我認爲是multiprocessing.Process

如果您仍想直接使用multiprocessing.Process,則應使用隊列來獲取返回值。在文檔中給出

例如:

from multiprocessing import Process, Queue 

def f(q): 
    q.put([42, None, 'hello']) 

if __name__ == '__main__': 
    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    print q.get() # prints "[42, None, 'hello']" 
    p.join() 

」 - Multiprocessing Docs

所以過程的東西,通常在後臺運行,做的東西一般,如果你做多處理他們需要'扔掉'數據,因爲進程沒有像線程一樣的共享內存 - 所以這就是爲什麼你使用隊列 - 它爲你做的。你可以做的另一件事是管道,方便他們給出一個例子,以及:)。 「

from multiprocessing import Process, Pipe 

def f(conn): 
    conn.send([42, None, 'hello']) 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    print parent_conn.recv() # prints "[42, None, 'hello']" 
    p.join() 

」 - Multiprocessing Docs

這樣做是手動使用管道周圍的成品結果扔在這種情況下,「父進程」。

而且有時我發現案件multiprocessing不能鹹菜很好,所以我用這個偉大的答案(或我的修改專門的變體)由mrule,他的職位here

from multiprocessing import Process, Pipe 
from itertools import izip 

def spawn(f): 
    def fun(pipe,x): 
     pipe.send(f(x)) 
     pipe.close() 
    return fun 

def parmap(f,X): 
    pipe=[Pipe() for x in X] 
    proc=[Process(target=spawn(f),args=(c,x)) for x,(p,c) in izip(X,pipe)] 
    [p.start() for p in proc] 
    [p.join() for p in proc] 
    return [p.recv() for (p,c) in pipe] 

if __name__ == '__main__': 
    print parmap(lambda x:x**x,range(1,5)) 

然而,你應該警告,這需要手動控制過程,所以某些事情可能導致「死亡」過程處於周圍 - 這不是一件好事,這是一個例子g意外的信號 - 這是一個使用管道進行多處理的例子:)。

如果這些命令不在Python中,例如你想運行ls那麼你可能會更好地使用subprocess,因爲os.system不再是一個好東西,因爲它現在認爲subprocess是一個更易於使用和更靈活的工具,討論提出here