Debuggen Sie Multiprocessing in Python

Antworten:

6

Echte Multiprocessing-Python-Programme (im Gegensatz zu Multithread- Python-Programmen, die sich mit der gefürchteten GIL auseinandersetzen müssen ) unterscheiden sich nicht von denen in einer anderen Sprache. Sie alle haben die gleichen grundlegenden Herausforderungen:

  1. Aufgabenzuordnung und Ergebnisberichterstattung. Selbst wenn sie hauptsächlich an unabhängigen Datensätzen arbeiten, müssen sie normalerweise zum Master-Thread zurückkehren , um Ergebnisse zu melden und neue Daten für die Arbeit zu erhalten. Dies kann eine Drosselstelle sein.
  2. Rennbedingungen. Prozesse versuchen, eine Ressource nach der anderen zu verwenden, und müssen Mutex (oder ähnliches) verwenden, um zu verhindern, dass die Daten des jeweils anderen überlagert werden. Wenn Sie derartige Ressourcen nicht schützen, kann dies zu sehr, sehr schmerzhaften Debugsitzungen führen.
  3. Sequentialität. Manchmal versuchst du etwas parallel zu machen, was nicht ist. Die verschiedenen Prozesse warten darauf, dass sie etwas tun, und das Endergebnis ist, dass Sie für alle Absichten und Zwecke ein sequentielles Programm erstellt haben, es parallel gemacht haben und es immer noch in linearer Zeit (oder schlechter) ausgeführt wird.

Obwohl es Entwicklungsmethoden gibt, die versuchen, jedes dieser Probleme zu vermeiden, müssen Sie am Ende des Tages wirklich darüber nachdenken, was Sie tun. Ich empfehle intensiven Stresstest - weit über alles hinaus, was im wirklichen Leben passieren könnte -, damit Sie die Chance haben, diese Windows of Opportunity zu erreichen und in der Entwicklung in die Luft zu jagen, anstatt mitten in einer großen Demo oder während der Produktion.

Früher verwendeten wir Protokolldateien mit Mikrosekunden-Zeitstempeln und erstellten dann eine App zum Anzeigen von farbcodierten Protokollen, um zu visualisieren, was zwischen N Prozessen auf M Prozessoren passierte. Wir haben auch versucht (und meistens geschafft), ein System zu erstellen, das die Protokolldateien vertreibt, um den Kontext des Absturzes wiederherzustellen.

Aber das beste Werkzeug ist gutes Design und wirklich böse, böse Leute, die versuchen, Ihre App aus dem Wasser zu jagen. (Hallo, Blödmann!)

Peter Rowell
quelle
25

Eine Sache, die ich sehr hilfreich finde, ist die Verwendung des vorhandenen Loggers im multiprocessingModul. Versuchen Sie dies in Ihrem Hauptcode:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

Siehe auch: http://docs.python.org/library/multiprocessing.html#logging

Darüber hinaus können Sie auf den aktuellen Prozessnamen zugreifen, indem Sie Folgendes verwenden:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

Siehe: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

Abgesehen davon kenne ich nichts anderes als die Standard-Debugging-Methoden wie pdb& co.

Exhuma
quelle