2016-10-04 39 views
2

我有這樣的程序:Pool.map VS Pool.map_async

from multiprocessing import Pool 
import time 

def f(x): 
# I make a heavy code here to take time 
    for i in range(10000): 
    for i in range(10000): 
     pass #do nothing 

    print x #print x 

if __name__ == '__main__': 
    pool = Pool(processes=4) 

    pool.map(f, range(10)) 
    r = pool.map_async(f, range(10)) 

    # DO STUFF 
    print 'HERE' 
    print 'MORE' 
    r.wait() 
    print 'Done' 

據我所知,pool.map將返回順序,而pool.map_async不會。 我試圖找出它們之間的差異,但我還沒有得到它。

Accutually,我看了一些帖子,例如:Python multiprocessing : map vs map_async

,但我仍然感到困惑。 我的問題是:

  1. 這兩個函數有什麼區別?
  2. 當運行上述代碼中,我得到這樣的:

1 3 2 0 4 6 5 7 8 9該處MORE 1 0 3 2 5 4 6 7 8 9完成

我預計pool.map將按順序返回輸出,但它沒有! 那麼,爲什麼沒有按順序返回呢?或者我誤解了這個功能?

  • 我覺得當pool.map叫,主(下面的代碼,像
    r = pool.map_async(f, range(10)); print 'HERE'; print 'MORE' 被繼續運行。因此,我希望 「在這裏」 和「更多「被印刷在數之間,我的意思是這樣
  • 3 2 0 4 6 5 HERE 7 8 9 1 0 3 2 5 MORE 4 6 7 8 9完成

    但它發生在其他方面。 爲什麼不按我的預期運行?

  • 如果我評論的重碼,所述f功能剛纔是:

    def f(x): print x

  • 然後兩者的功能將返回(我試了很多次,總是打印相同的結果。 那麼,爲什麼它的行爲不同時,它的/沒有沉重代碼

    任何幫助,將不勝感激。 謝謝。

    回答

    1
    from multiprocessing import Pool 
    import time 
    
    def f(x): 
    # I make a heavy code here to take time 
        for i in range(10000): 
        for i in range(10000): 
         pass #do nothing 
        print x 
        return x 
    
    if __name__ == '__main__': 
        pool = Pool(processes=4) 
    
        print pool.map(f, range(10)) 
        r = pool.map_async(f, range(10)) 
    
        # DO STUFF 
        print 'HERE' 
        print 'MORE' 
        r.wait() 
        print 'Done' 
        print r.get() 
    
    1. pool.map_async不會阻止你的腳本,而pool.map將(由quikst3r提到)。
    2. 我稍微調整了腳本,使其更具說明性。正如你所看到的,最終的結果都是按順序排列的,除了在啓動pool.map_async後執行後面的代碼。輸出是:

      1 
      3 
      0 
      2 
      4 
      5 
      7 
      6 
      8 
      9 
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
      HERE 
      MORE 
      3 
      2 
      1 
      0 
      5 
      4 
      6 
      7 
      8 
      9 
      Done 
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
      

    而打印順序很難確定是由於你的CPU的工作分配和個人負擔費用。

    相關問題