2

使用 Python 2.6.7 运行时,以下脚本挂起。[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]它在 Python 2.7 中按预期打印。这可能是 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
4

1 回答 1

2

是的,这是python2.6中的一个bug

您正在使用的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)
于 2014-05-12T15:30:39.190 回答