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.)
Steven Bethard hat einen Weg gepostet , um Methoden zu ermöglichen gebeizt / ungebeizt. Du könntest es so benutzen:
%Vor%Dann
%Vor%ergibt
%Vor% 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: Ссылка
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 Ссылка
Tags und Links python class multiprocessing