multiprocessing.Pool, das neue Kinder nach terminate () unter Linux / Python2.7 erzeugt?

Ich habe eine ausführbare Datei, die ich sehr oft mit verschiedenen Parametern ausführen muss. Zu diesem Zweck habe ich einen kleinen Python (2.7) -Wrapper geschrieben, der das Multiprocessing-Modul verwendet und dem angegebenen Muster folgtHier.

Mein Code sieht so aus:

try:
     logging.info("starting pool runs")
     pool.map(run_nlin, params)
     pool.close()
 except KeyboardInterrupt:
     logging.info("^C pressed")
     pool.terminate()
 except Exception, e:
     logging.info("exception caught: ", e)
     pool.terminate()
 finally:
     time.sleep(5)
     pool.join()
     logging.info("done")

Meine Arbeiterfunktion ist hier:

class KeyboardInterruptError(Exception): pass

def run_nlin((path_config, path_log, path_nlin, update_method)):
    try:
        with open(path_log, "w") as log_:
            cmdline = [path_nlin, path_config]
            if update_method:
                cmdline += [update_method, ]
            sp.call(cmdline, stdout=log_, stderr=log_)
    except KeyboardInterrupt:
        time.sleep(5)
        raise KeyboardInterruptError()
    except:
        raise

path_config ist der Pfad zu einer Konfigurationsdatei für das Binärprogramm; darin ist z.B. das Datum, für das das Programm ausgeführt werden soll.

Wenn ich den Wrapper starte, sieht alles gut aus. Wenn ich jedoch drücke^C, scheint das Wrapper-Skript eine zusätzliche zu startennumproc Prozesse aus dem Pool vor dem Beenden. Wenn ich zum Beispiel das Skript für die Tage 1 bis 10 starte, sehe ich inps aux gibt aus, dass zwei Instanzen des Binärprogramms ausgeführt werden (normalerweise für die Tage 1 und 3). Nun, wenn ich drücke^CWenn das Wrapper-Skript beendet wird, sind die Binärprogramme für die Tage 1 und 3 nicht mehr vorhanden, aber für die Tage 5 und 7 werden neue Binärprogramme ausgeführt.

Mir kommt es also so vor, als ob diePool startet eine anderenumproc Prozesse vor dem endgültigen Tod.

Irgendwelche Ideen, was hier passiert und was ich dagegen tun kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage