multiprocessing.Pool.imap_unordered在Python 2.6中挂起?

时间:2013-04-24 17:09:41

标签: python multiprocessing

以下脚本在使用Python 2.6.7运行时挂起。它按照Python 2.7中的预期打印[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。它可能是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的使用在此非常重要。在mapper中分配__init__,如下所示可以解决问题:

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

1 个答案:

答案 0 :(得分:1)

是的,这是python2.6中的一个错误

您正在使用的Pool对象需要在某处继续引用,否则python将在尝试使用 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)