2009-11-09 15 views
52

Ich bin für eine einfache prozessbasierte parallel Karte für Python suchen, das heißt, eine FunktionGibt es eine einfache prozessbasierte parallele Karte für Python?

parmap(function,[data]) 

dass Funktion für jedes Element von [Daten] auf einem anderen Prozess (na ja, auf einem anderen laufen würde Core, aber AFAIK, die einzige Möglichkeit, Sachen auf verschiedenen Kernen in Python auszuführen, besteht darin, mehrere Interpreter zu starten) und eine Ergebnisliste zurückzugeben.

Gibt es so etwas? Ich möchte etwas einfach, so ein einfaches Modul wäre schön. Natürlich, wenn es so etwas gibt, ich für eine große Bibliothek begleichen: -/

Antwort

93

ich wie scheint, was Sie brauchen, ist die map method in multiprocessing.Pool():

map(func, iterable[, chunksize])

A parallel equivalent of the map() built-in function (it supports only 
one iterable argument though). It blocks till the result is ready. 

This method chops the iterable into a number of chunks which it submits to the 
process pool as separate tasks. The (approximate) size of these chunks can be 
specified by setting chunksize to a positive integ 

Zum Beispiel, wenn Sie diese Funktion zuordnen wollte :

def f(x): 
    return x**2 

(10) reichen, können Sie es mit Hilfe der integrierten Karte() -Funktion tun könnte:

map(f, range(10)) 

oder die Methode map eines multiprocessing.Poll() -Objekts verwenden:

import multiprocessing 
pool = multiprocessing.Pool() 
print pool.map(f, range(10)) 
+0

Vielen Dank für Ihre ausführliche Antwort! –

+4

Wenn Sie dies aus einem langlebigen Programm aufrufen, stellen Sie sicher, dass Sie 'pool.close' aufrufen (idealerweise im' finally' Block eines umschließenden 'try/finally'). Andernfalls kann es vorkommen, dass der Pool untergeordnete Prozesse nicht bereinigt und Sie mit Zombie-Prozessen enden können. Siehe http://bugs.python.org/issue19675 – rogueleaderr

+2

@roguleeaderr Wäre es nicht idiomatischer, "mit" zu verwenden? – CodeMonkey

Verwandte Themen