Keyboard Interrupt mit Pythons Multiprocessing

8

Ich habe Probleme bei der Behandlung eines Tastatur-Interrupts mit Pythons Multi-Processing

(Ja, ich weiß, dass Ctr-C kein ordnungsgemäßes Herunterfahren garantieren sollte - aber lass diese Diskussion für einen anderen Thread offen)

Betrachten Sie den folgenden Code, wobei ich ein multiprocessing.Manager#list() Benutzer bin, was ein ListProxy ist, von dem ich verstanden habe, dass er Multi-Prozess-Zugriff auf eine Liste behandelt.

Wenn ich Ctr-C daraus mache - erhalte ich socket.error: [Errno 2] No such file or directory , wenn ich versuche auf den ListProxy zuzugreifen

Ich hätte gerne, dass die geteilte Liste nicht auf Ctr-C verfälscht wird. Ist das möglich?!

Hinweis: Ich möchte dies ohne Verwendung von Pools und Warteschlangen lösen.

%Vor%

Wenn Sie das ausführen und dann Ctr-C drücken, erhalten wir Folgendes:

%Vor%

(Hier ist ein anderer Ansatz, der multiprocessing.Lock mit ähnlichem Effekt verwendet ... gist ) Ähnliche Fragen:

Jonathan 14.01.2014, 02:21
quelle

2 Antworten

15

multiprocessing.Manager () startet einen untergeordneten Prozess, der für die Verarbeitung Ihres gemeinsam genutzten Listen-Proxys zuständig ist.

netstat Ausgabe während der Ausführung:

  

unix 2 [ACC] STREAM HÖREN 3921657 8457 / python   / tmp / pymp-B9dcij / listener-X423Ml

Dieser von multiprocessing.manager () erstellte untergeordnete Prozess fängt Ihr SIGINT und den Ausgang ab, was dazu führt, dass alles, was damit zusammenhängt, dereferenziert wird, daher Ihr Fehler "keine solche Datei" (ich habe auch mehrere andere Fehler bekommen, je nachdem wann ich SIGINT gesendet habe ).

Um dies zu lösen, können Sie direkt ein SyncManager-Objekt deklarieren (anstatt es von Manager () für Sie tun zu lassen). Dazu müssen Sie die start () -Methode verwenden, um den untergeordneten Prozess tatsächlich zu starten. Die Methode start () verwendet eine Initialisierungsfunktion als erstes Argument (Sie können hier SIGINT für den Manager überschreiben).

Code unten, versuchen Sie es:

%Vor%     
KorreyD 14.01.2014, 05:09
quelle
0

Wie ich auf ähnliche Frage antworte ( duplizieren ) :

Einfachste Lösung - starten Sie den Manager mit

%Vor%

anstelle von manager.start (). Und prüfen Sie, ob sich das Signalmodul in Ihren Importen befindet (Importsignal).

Dies fängt und ignoriert SIGINT (Ctrl-C) im Manager-Prozess.

    
petr 19.02.2017 15:42
quelle