2013-04-24 95 views
1

以下腳本在使用Python 2.6.7運行時會掛起。它按預期在Python 2.7中打印[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。它可能是Python 2.6中的一個錯誤嗎?有沒有解決方法?multiprocessing.Pool.imap_unordered在Python 2.6中掛起?

def p1(x): 
    return x + 1 


class Tasks(object): 

    @property 
    def mapper(self): 
     from multiprocessing import Pool 
     pool = Pool(processes=2) 
     return pool.imap_unordered 

    def run(self): 
     xs = range(10) 
     return self.mapper(p1, xs) 


ts = Tasks() 
print(list(ts.run())) 

在我的計劃,我可以通過重寫Tasks.run要解決的竅門:

def run(self): 
     xs = range(10) 
     mapper = mapper 
     return mapper(p1, xs) 

但我不能用上面的腳本重現此。

另請注意,在這裏使用@property是必不可少的。在分配像__init__以下mapper解決了這個問題:

def __init__(self): 
    from multiprocessing import Pool 
    pool = Pool(processes=2) 
    self.mapper = pool.imap_unordered 
+0

嗨,我還沒有試過這種解決方案,但你可以試一試:http://www.rueckstiess.net/research/snippets/show/ca1d7d90 – n3rV3 2013-04-24 17:42:24

+0

我不發送類的實例,所以我認爲這個鏈接是無關緊要的。 – tkf 2013-04-24 18:37:13

回答

1

是的,這是python2.6的

您使用需要留地方引用的對象Pool錯誤,否則蟒蛇將掛起當試圖使用imap *方法(可能還有其他方法)

這是您的示例的修復程序。請注意,池對象保留在Tasks對象內,這可能會破壞現有的代碼。

class Tasks(object): 
    _pool = None 

    @property 
    def mapper(self): 
     from multiprocessing import Pool 
     if self._pool is None: 
      self._pool = Pool(processes=2) 
     return self._pool.imap_unordered 

    def run(self): 
     xs = range(10) 
     return self.mapper(p1, xs)