Es gibt eine Abzweigung von multiprocessing
genannt. Pathos ( Hinweis: Verwenden Sie die Version auf GitHub ), die nicht benötigt werden starmap
-- die map-Funktionen spiegeln die API für Pythons map wider, daher kann map mehrere Argumente annehmen.
Con pathos
können Sie im Allgemeinen auch Multiprocessing im Interpreter durchführen, anstatt in der __main__
blockieren. Pathos ist nach einigen leichten Aktualisierungen - hauptsächlich der Umstellung auf Python 3.x - für eine Veröffentlichung vorgesehen.
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
<processing.pool.IMapIterator object at 0x110c2ffd0>
>>> list(result)
[1, 32, 729]
pathos
bietet mehrere Möglichkeiten, um das genaue Verhalten von 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]
>>>
12 Stimmen
Zu meiner Überraschung konnte ich weder die
partial
nochlambda
dies tun. Ich denke, es hat mit der seltsamen Art und Weise zu tun, wie Funktionen an die Unterprozesse übergeben werden (überpickle
).15 Stimmen
@senderle: Dies ist ein Fehler in Python 2.6, der aber mit 2.7 behoben wurde: bugs.python.org/issue5228
3 Stimmen
Ersetzen Sie einfach
pool.map(harvester(text,case),case, 1)
von:pool.apply_async(harvester(text,case),case, 1)
5 Stimmen
@Syrtis_Major , bitte editieren Sie keine OP-Fragen, die Antworten, die bereits gegeben wurden, effektiv verdrehen. Hinzufügen von
return
àharvester()
hat die Antwort von @senderie als ungenau bezeichnet. Das ist für künftige Leser nicht hilfreich.3 Stimmen
Ich würde sagen, eine einfache Lösung wäre, alle Args in ein Tupel zu packen und es in der ausführenden Funktion zu entpacken. Ich habe dies getan, wenn ich komplizierte mehrere Args an eine Funktion senden musste, die von einem Pool von Prozessen ausgeführt wird.
0 Stimmen
Vielleicht gibt es eine gewisse Komplexität, die ich für diesen speziellen Anwendungsfall vermisse, aber ein Teil funktioniert für meinen ähnlichen Anwendungsfall und ist sehr prägnant und einfach zu verwenden. python.omics.wiki/multiprocessing_map/