How to use multiprocessing pool.map with multiple arguments?

前端 未结 20 3473
-上瘾入骨i
-上瘾入骨i 2020-11-21 11:24

In the Python multiprocessing library, is there a variant of pool.map which supports multiple arguments?

text = "test"
def         


        
20条回答
  •  别跟我提以往
    2020-11-21 11:48

    There's a fork of multiprocessing called pathos (note: use the version on github) that doesn't need starmap -- the map functions mirror the API for python's map, thus map can take multiple arguments. With pathos, you can also generally do multiprocessing in the interpreter, instead of being stuck in the __main__ block. Pathos is due for a release, after some mild updating -- mostly conversion to python 3.x.

      Python 2.7.5 (default, Sep 30 2013, 20:15:49) 
      [GCC 4.2.1 (Apple Inc. build 5566)] on darwin
      Type "help", "copyright", "credits" or "license" for more information.
      >>> def func(a,b):
      ...     print a,b
      ...
      >>>
      >>> from pathos.multiprocessing import ProcessingPool    
      >>> pool = ProcessingPool(nodes=4)
      >>> pool.map(func, [1,2,3], [1,1,1])
      1 1
      2 1
      3 1
      [None, None, None]
      >>>
      >>> # also can pickle stuff like lambdas 
      >>> result = pool.map(lambda x: x**2, range(10))
      >>> result
      [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
      >>>
      >>> # also does asynchronous map
      >>> result = pool.amap(pow, [1,2,3], [4,5,6])
      >>> result.get()
      [1, 32, 729]
      >>>
      >>> # or can return a map iterator
      >>> result = pool.imap(pow, [1,2,3], [4,5,6])
      >>> result
      
      >>> list(result)
      [1, 32, 729]
    

    pathos has several ways that that you can get the exact behavior of starmap.

    >>> def add(*x):
    ...   return sum(x)
    ... 
    >>> x = [[1,2,3],[4,5,6]]
    >>> import pathos
    >>> import numpy as np
    >>> # use ProcessPool's map and transposing the inputs
    >>> pp = pathos.pools.ProcessPool()
    >>> pp.map(add, *np.array(x).T)
    [6, 15]
    >>> # use ProcessPool's map and a lambda to apply the star
    >>> pp.map(lambda x: add(*x), x)
    [6, 15]
    >>> # use a _ProcessPool, which has starmap
    >>> _pp = pathos.pools._ProcessPool()
    >>> _pp.starmap(add, x)
    [6, 15]
    >>> 
    

提交回复
热议问题