Python: Effiziente Problemumgehung für die Mehrfachverarbeitung einer Funktion, die ein Datenelement einer Klasse innerhalb dieser Klasse ist

8

Ich kenne verschiedene Diskussionen von Einschränkungen des Multiprocessing-Moduls beim Umgang mit Funktionen, die Datenmitglieder einer Klasse sind (aufgrund von Beizproblemen).

Aber gibt es ein anderes Modul, oder irgendeine Art von Workaround in Multiprocessing, die etwas spezifisch wie das folgende erlaubt (speziell ohne die Definition der Funktion zu zwingen, parallel angewendet zu werden, um außerhalb der Klasse zu existieren)?

%Vor%

Hinweis: Ich kann dies leicht tun, indem ich my_single_function außerhalb der Klasse verschiebe und etwas wie foo.my_args an die Befehle map oder map_async übergebe. Dies verschiebt jedoch die parallelisierte Ausführung der Funktion außerhalb von Instanzen von MyClass .

Für meine Anwendung (Parallelisierung einer großen Datenabfrage, die monatliche Datenquerschnitte abruft, verbindet und bereinigt und sie dann an eine lange Zeitreihe mit solchen Querschnitten anfügt), ist es sehr wichtig, diese zu haben Funktionalität innerhalb der Klasse , da verschiedene Benutzer meines Programms verschiedene Instanzen der Klasse mit unterschiedlichen Zeitintervallen, unterschiedlichen Zeitinkrementen, verschiedenen Untermengen von zu sammelnden Daten usw. instanziieren mit dieser Instanz verknüpft.

Daher möchte ich, dass die Arbeit der Parallelisierung auch von der Instanz ausgeführt wird, da sie alle Daten besitzt, die für die parallelisierte Abfrage relevant sind, und es wäre einfach albern, eine Hacky-Wrapper-Funktion zu schreiben, die an einige Argumente bindet und lebt außerhalb der Klasse (Zumal eine solche Funktion nicht allgemein wäre. Es würde alle Arten von Spezifika innerhalb der Klasse benötigen.)

    
ely 30.07.2012, 17:48
quelle

3 Antworten

8

Steven Bethard hat einen Weg gepostet , um Methoden zu ermöglichen gebeizt / ungebeizt. Du könntest es so benutzen:

%Vor%

Dann

%Vor%

ergibt

%Vor%     
unutbu 30.07.2012, 18:07
quelle
4

Wenn Sie eine Verzweigung von multiprocessing mit dem Namen pathos.multiprocesssing verwenden, können Sie direkt Klassen und Klassenmethoden in den map -Funktionen der Mehrfachverarbeitung verwenden. Dies liegt daran, dass dill anstelle von pickle oder cPickle verwendet wird und dill fast alles in Python serialisieren kann.

pathos.multiprocessing stellt auch eine asynchrone Kartenfunktion zur Verfügung ... und es kann map mit mehreren Argumenten arbeiten (z.B. map(math.pow, [1,2,3], [4,5,6]) )

Siehe: Was können Multiprocessing und Dill zusammen tun?

und: Ссылка

%Vor%

Sie können also genau das tun, was Sie tun wollten, glaube ich.

%Vor%

Holen Sie sich den Code hier:   Ссылка

    
Mike McKerns 30.01.2014 04:31
quelle
1

Es gibt eine bessere elegante Lösung, glaube ich. Fügen Sie einem Code, der Multiprozessing mit der Klasse durchführt, die folgende Zeile hinzu, und Sie können die Methode weiterhin über den Pool übergeben. Die Codes sollten über die Klasse

gehen %Vor%

für mehr Verständnis, wie man eine Methode einläßt, sehen Sie bitte unten Ссылка

    
Sri 08.11.2013 14:36
quelle

Tags und Links