代码之家  ›  专栏  ›  技术社区  ›  Indominus

pathos.multiprocessing有星图吗?

  •  1
  • Indominus  · 技术社区  · 7 年前

    执行下面的代码时出错。问题似乎是 map 不支持接受多个输入的函数,就像python内置的一样 multiprocessing 包裹。但在内置包中,有一个 starmap 这就解决了这个问题。做 pathos.multiprocessing 有一样吗?

    import pathos.multiprocessing as mp
    
    
    class Bar:
        def foo(self, name):
            return len(str(name))
    
        def boo(self, x, y, z):
            sum = self.foo(x)
            sum += self.foo(y)
            sum += self.foo(z)
            return sum
    
    
    if __name__ == '__main__':
        b = Bar()
        pool = mp.ProcessingPool()
        results = pool.map(b.boo, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
        print(results)
    

    类型错误:boo()缺少2个必需的位置参数:“y”和“z”

    按建议更新lambda表达式(不起作用):

    if __name__ == '__main__':
        b = Bar()
        pool = mp.ProcessingPool()
        results = pool.map(lambda x: b.boo(*x), [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
        print(results)
    

    multiprocess.pool.remotetraceback:

    “”

    回溯(最近一次呼叫的最后一次):

    文件 “C:\users\yg451\anaconda3\lib\site packages\multiprocess\pool.py”, 第121行,工人

    结果=(真,func(*args,**kwds))

    文件 “C:\users\yg451\anaconda3\lib\site packages\multiprocess\pool.py”, 地图星44号线

    返回列表(map(*args))

    文件 “C:\users\yg451\anaconda3\lib\site packages\pathos\helpers\mp_helper.py”, 第15行

    func=lambda参数:f(*args)

    文件“C:/users/yg451/code/foo/machine 学习/xpype/test/scratch.py“,第18行,in

    结果=pool.map(lambda x:b.boo(*x),[(12,3,456),(8,9,10),(‘a’,‘b’,‘cde’)。

    名称错误:未定义名称“b”

    “”

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mike McKerns    7 年前

    我是 pathos 作者。 悲怆 年龄大于 starmap 不需要。它在池中解决了多个参数,与内置的 map 做。

    >>> import pathos.multiprocessing as mp
    >>> class Bar:
    ...     def foo(self, name):
    ...         return len(str(name))
    ...     def boo(self, x, y, z):
    ...         sum = self.foo(x)
    ...         sum += self.foo(y)
    ...         sum += self.foo(z)
    ...         return sum
    ... 
    >>> b = Bar()
    >>> pool = mp.ProcessingPool()
    >>> f = lambda x: b.boo(*x)    
    >>> results = pool.map(f, [(12, 3, 456), (8, 9, 10), ('a', 'b', 'cde')])
    >>> results 
    [6, 4, 5]
    >>> results = pool.map(b.boo, [12, 9, 'a'], [3, 9, 'b'], [456, 10, 'cde'])
    >>> results
    [6, 4, 5]
    >>> results = map(b.boo, [12, 9, 'a'], [3, 9, 'b'], [456, 10, 'cde'])
    >>> list(results)
    [6, 4, 5]
    >>> 
    

    所以,本质上, 星图 是不必要的。但是,因为它最近被添加到标准中 Pool 界面在 multiprocessing 在某些版本的python中,它可能在 悲怆 . 请注意,已经可以使用“增强”版本 星图 悲怆 如果你喜欢的话。

    >>> import pathos
    >>> mp = pathos.helpers.mp
    >>> p = mp.Pool()
    >>> p.starmap
    <bound method Pool.starmap of <multiprocess.pool.Pool object at 0x1038684e0>>
    >>>