2013-04-24 104 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)