简体   繁体   English

随后如何运行两个并行进程?

[英]How to run two parallel processes subsequently?

I want to make sure the following two parallel processes are implemented one after the other. 我想确保以下两个并行过程一个接一个地实现。 In particular, I want the ten f functions are implemented first, and after that part is finished, the ten g functions are implemented. 特别是,我希望先执行十个f函数,然后在完成该部分后再执行十个g函数。 Does anyone know how I should modify my code? 有谁知道我应该如何修改我的代码?

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"

And the results I got are: 我得到的结果是:

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

Thanks so much! 非常感谢!

All f 's and g 's need to be joined. 所有的fg需要加入。

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"

outputs: 输出:

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

Your problem is in your code you are only joining the last process you spawn in the loop, you could continue before previous ones are complete, that causes the interleaving of output. 您的问题是在代码中,您仅加入循环中生成的最后一个进程,可以在之前的进程完成之前继续执行,这会导致输出交错。

You could use a process pool: 您可以使用进程池:

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

Use a blocking map function instead of doing the nitty-gritty work yourself. 使用阻塞map功能,而不要自己动手做。 You can do the following with the built-in multiprocessing , but since I am lazy I just did it from the interpreter (doing so requires a fork of multiprocessing called pathos . 您可以使用内置的multiprocessing执行以下操作,但是由于我很懒,所以我只是从解释器执行了此操作(这样做需要一个称为pathosmultiprocessing分叉。

>>> 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)
... 
>>> 

then create and launch the map 然后创建并启动地图

>>> 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
>>> 

you can get pathos here: https://github.com/uqfoundation 你可以在这里得到pathoshttps : //github.com/uqfoundation

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM