我正在做幾個進程。每個過程都會返回一些結果。我將如何收集這些過程的結果。從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
返回一些結果。我想收集這些結果並將它們保存在一些變量中。
我正在做幾個進程。每個過程都會返回一些結果。我將如何收集這些過程的結果。從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
返回一些結果。我想收集這些結果並將它們保存在一些變量中。
如果進程是外部腳本,則嘗試使用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.
任何downvote的原因? – rlms
所以現在我建議,因爲它處理了不少給你,你應該使用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()
所以過程的東西,通常在後臺運行,做的東西一般,如果你做多處理他們需要'扔掉'數據,因爲進程沒有像線程一樣的共享內存 - 所以這就是爲什麼你使用隊列 - 它爲你做的。你可以做的另一件事是管道,方便他們給出一個例子,以及:)。 「
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
不能鹹菜很好,所以我用這個偉大的答案(或我的修改專門的變體)由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。
使用'multiprocessing'模塊中的'apply_async',如[這裏]所述(http://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers) – mtadd