[英]How to run two parallel processes subsequently?
我想确保以下两个并行过程一个接一个地实现。 特别是,我希望先执行十个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
非常感谢!
所有的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
您的问题是在代码中,您仅加入循环中生成的最后一个进程,可以在之前的进程完成之前继续执行,这会导致输出交错。
您可以使用进程池:
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
使用阻塞map
功能,而不要自己动手做。 您可以使用内置的multiprocessing
执行以下操作,但是由于我很懒,所以我只是从解释器执行了此操作(这样做需要一个称为pathos
的multiprocessing
分叉。
>>> 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.