Estoy de acuerdo que el uso de Pool
desde multiprocessing
es probablemente la mejor ruta si desea permanecer dentro de la biblioteca estándar. Si está interesado en hacer otros tipos de procesamiento paralelo, pero no aprende nada nuevo (es decir, sigue usando la misma interfaz que multiprocessing
), puede probar pathos
, que proporciona varias formas de mapas paralelos y tiene prácticamente la misma interfaz que multiprocessing
hace.
Python 2.7.6 (default, Nov 12 2013, 13:26:39)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numToFactor = 976
>>> def isFactor(x):
... result = None
... div = (numToFactor/x)
... if div*x == numToFactor:
... result = (x,div)
... return result
...
>>> from pathos.multiprocessing import ProcessingPool as MPool
>>> p = MPool(4)
>>> possible = range(1,int(numpy.floor(numpy.sqrt(numToFactor)))+1)
>>> # standard blocking map
>>> result = [x for x in p.map(isFactor, possible) if x is not None]
>>> print result
[(1, 976), (2, 488), (4, 244), (8, 122), (16, 61)]
>>>
>>> # asynchronous map (there's also iterative maps too)
>>> obj = p.amap(isFactor, possible)
>>> obj
<processing.pool.MapResult object at 0x108efc450>
>>> print [x for x in obj.get() if x is not None]
[(1, 976), (2, 488), (4, 244), (8, 122), (16, 61)]
>>>
>>> # there's also parallel-python maps (blocking, iterative, and async)
>>> from pathos.pp import ParallelPythonPool as PPool
>>> q = PPool(4)
>>> result = [x for x in q.map(isFactor, possible) if x is not None]
>>> print result
[(1, 976), (2, 488), (4, 244), (8, 122), (16, 61)]
Además, pathos
tiene un paquete de hermana con la misma interfaz, llamada pyina
, que se extiende mpi4py
, pero proporciona con mapas paralelas que se ejecutan en MPI y se pueden ejecutar utilizando varios programadores.
Otra ventaja es que pathos
viene con un serializador mucho mejor del que se puede obtener en python estándar, por lo que es mucho más capaz que multiprocessing
de serializar una gama de funciones y otras cosas. Y puedes hacer todo desde el intérprete.
>>> class Foo(object):
... b = 1
... def factory(self, a):
... def _square(x):
... return a*x**2 + self.b
... return _square
...
>>> f = Foo()
>>> f.b = 100
>>> g = f.factory(-1)
>>> p.map(g, range(10))
[100, 99, 96, 91, 84, 75, 64, 51, 36, 19]
>>>
Obtener el código aquí: https://github.com/uqfoundation
Aquí es otra manera, he explicado aquí: - [Procesos roscados activos mínimos] [1] [1]: http://stackoverflow.com/a/32337959/4850220 –