2014-06-13 26 views
1

我想确保以下两个并行进程一个接一个地执行。特别是,我希望首先实现十个f函数,并在完成该部分之后,实现十个g函数。有谁知道我应该如何修改我的代码?如何随后运行两个并行进程?

from multiprocessing import Process 
import time 
import random 

wait_low = 0.1 
wait_high = 15 

def f(i): 
    time.sleep(random.uniform(wait_low, wait_high)) 
    print 'hello'+str(i) 

def g(i): 
    time.sleep(random.uniform(wait_low, wait_high)) 
    print 'hey'+str(i) 


if __name__ == '__main__': 
    for j in range(10): 
     p = Process(target=f, args=(j,)) 
     p.start() 
    p.join() 

    print "switch" 

    # comment 
    for j in range(10): 
     q = Process(target=g, args=(j,)) 
     q.start() 
    q.join() 

    time.sleep(5) 

    print "I'm done" 

而且我得到的结果是:

hello2 
hello0 
hello1 
hello5 
hello6 
hello8 
hello3 
hello7 
hello9 
switch 
hey6 
hey3 
hello4 
hey9 
hey8 
I'm done 
hey2 
hey0 
hey1 
hey5 
hey7 
hey4 

非常感谢!

回答

3

所有f的和g的需要连接。

if __name__ == '__main__': 
    fs = [] 
    for j in range(10): 
     p = Process(target=f, args=(j,)) 
     p.start() 
     fs.append(p) 

    for f in fs: 
     f.join() 

    print "switch" 

    # comment 
    gs = [] 
    for j in range(10): 
     q = Process(target=g, args=(j,)) 
     q.start() 
     gs.append(q) 

    for g in gs: 
     g.join() 

    print "I'm done" 

输出:

hello2 
hello8 
hello5 
hello6 
hello9 
hello1 
hello4 
hello3 
hello7 
hello0 
switch 
hey0 
hey7 
hey2 
hey8 
hey4 
hey3 
hey1 
hey9 
hey5 
hey6 
I'm done 
+0

这非常非常感谢 – user3698176

+0

@ user3698176,没问题,请接受的解决方案。!。 – Fabricator

2

你的问题是在你的代码中,你只加入了你在循环中产生的最后一个进程,你可以在之前的完成之前继续,这会导致输出的交错。

你可以使用一个处理池:

from multiprocessing.pool import Pool 
import random 
import time 

wait_low = 0 
wait_high=1 
def f(i): 
    time.sleep(random.uniform(wait_low, wait_high)) 
    return 'hello'+str(i) 

def g(i): 
    time.sleep(random.uniform(wait_low, wait_high)) 
    return 'hey'+str(i) 


pool = Pool() 
for output in pool.imap_unordered(f, range(10)): 
    print output 
for output in pool.imap_unordered(g, range(10)): 
    print output 
0

使用阻断map功能而不是做你自己的基本事实的工作。你可以用内置的multiprocessing,但因为我懒我只是做了它的解释(这样做需要的multiprocessing叉叫pathos

>>> from pathos.multiprocessing import ProcessingPool as Pool 
>>> import time 
>>> import random 
>>> 
>>> wait_low = 0.1 
>>> wait_high = 15 
>>> 
>>> def f(i): 
... time.sleep(random.uniform(wait_low, wait_high)) 
... print 'hello'+str(i) 
... 
>>> def g(i): 
... time.sleep(random.uniform(wait_low, wait_high)) 
... print 'hey'+str(i) 
... 
>>> 

以下然后创建并启动地图

>>> p = Pool() 
>>> r = p.map(f, range(10)); print "switch"; r = p.map(g, range(10)); print "I'm done" 
hello6 
hello2 
hello1 
hello0 
hello5 
hello8 
hello3 
hello4 
hello7 
hello9 
switch 
hey5 
hey6 
hey7 
hey1 
hey9 
hey4 
hey8 
hey3 
hey0 
hey2 
I'm done 
>>> 

你可以得到pathos这里:https://github.com/uqfoundation