簡體   English   中英

隨后如何運行兩個並行進程?

[英]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

非常感謝!

所有的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"

輸出:

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執行以下操作,但是由於我很懶,所以我只是從解釋器執行了此操作(這樣做需要一個稱為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)
... 
>>> 

然后創建並啟動地圖

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

你可以在這里得到pathoshttps : //github.com/uqfoundation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM