Was ist ein sicherer Weg, um zu stoppen einen Laufenden thread?
Ich habe einen thread, der enthält die Ausführung einer IronPython-Skript. Für einige Grund ich muss aufhören diesen thread zu jeder Zeit, einschließlich der Skript-Ausführung. Wie dies zu erreichen? Die erste Idee ist Thread.Abort()
, aber es ist bekannt, böse zu sein...
Ja, Rucken den Teppich unter einem thread ist böse. Aber wenn es das ist, was Sie tun möchten, dann
Hat dein thread-Schleife oder ist es nur ausführen für die Ausführung eines einzelnen Skripts und dann sterben?
Es Schleifen, aber jeder iteration enthält die Skript-Ausführung, die können sehr lang werden.
was genau meinst du mit design ändern?
So, dass Sie nicht "brauchen, um zu stoppen [die] thread zu jeder Zeit". Es ist wirklich nicht genug Kontext, in sich für mich die Frage zu geben, mehr spezifische Beratung. Mein Punkt ist, dass Sie Recht über
Thread.Abort()
ist der Weg zu gehen. Die bessere Lösung ist, ändern Sie Ihre Anwendung entwerfen.Hat dein thread-Schleife oder ist es nur ausführen für die Ausführung eines einzelnen Skripts und dann sterben?
Es Schleifen, aber jeder iteration enthält die Skript-Ausführung, die können sehr lang werden.
was genau meinst du mit design ändern?
So, dass Sie nicht "brauchen, um zu stoppen [die] thread zu jeder Zeit". Es ist wirklich nicht genug Kontext, in sich für mich die Frage zu geben, mehr spezifische Beratung. Mein Punkt ist, dass Sie Recht über
Thread.Abort
nicht ideal, aber es ist nicht so, dass die Funktion, die bösen, es ist, was es tut. Und da es genau das tut, was Sie wollen...InformationsquelleAutor aplavin | 2012-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut von Ihnen Frage und die nachfolgenden Kommentare kann ich schlage vor, Sie zwei Optionen, mit einigen zusätzlichen "Warnungen":
Wenn dein thread-Schleifen ausführen etwas, das bei jeder iteration, können Sie eine volatile boolean flag, so dass es beendet nach Beendigung der aktuellen iteration (pseudocode, weil ich bin nicht vertraut mit python):
Dann setzen Sie einfach die Flagge zu
true
wenn Sie wollen, den thread zu stoppen, und es wird aufhören, wenn das nächste mal die Bedingung überprüft.Wenn Sie nicht warten können, bis die iteration beendet ist, und müssen ihn sofort aufhalten, können Sie sich für eine
Thread.Abort
, aber stellen Sie absolut sicher, dass es keine Möglichkeit gibt, Sie offen lassen kann Datei-handles, sockets, sperren oder sonst etwas, wie dies in einem inkonsistenten Zustand.Thread.Abort()
, weil überall Leute schreiben so etwas wie "NIEMALS!!!"))). Aber jetzt benutze ich es in der Programm - ho Griffe bleiben geöffnet.Es ist wahr, dass die meisten der Zeit, es ist schlecht, aber speziell, weil die Menschen neigen dazu, die Verwendung von threads für I/O oder andere Dinge wie diese, wird in einem inkonsistenten Zustand, wenn der thread getötet. Wenn Sie nicht mit dem thread für so etwas, dann ist es perfekt sicher.
Und ist es garantiert, dass Threads mit code wie diesem
try { // do work - no try/catches here } catch(ThreadAbortException) { // log exit }
wird gestoppt, nach dem AufrufAbort()
?nicht. Das ist in keiner Weise garantiert. Insbesondere, wenn Sie haben eine feindliche code läuft in dem thread, die Sie versuchen, Abbrechen, dann haben Sie bereits verloren, feindliche Codes ignorieren kann, einen thread abzubrechen. Abbruch der thread sollte gedacht werden als scharf formulierte Vorschlag an den thread, dass es Weg geht; ein thread, der feindlich ist, Absicht kann es ignorieren, auf Ihre Laune, wenn es clever geschrieben.
Erweitern Sie Ihr ausgezeichneter Punkt: Sie wissen, was ist schlimmer, als Sie ein Datei-handle geöffnet? Schließen Datei-handle, wenn nur die Hälfte der Daten des Benutzers wurden zwischengespeichert, lassen Sie das Dokument in einem Defekten Zustand befindet, so dass keine der Benutzer die Daten wiederhergestellt werden. Ähnlich verhält es sich mit sperren, so dass ein monitor in der eingegebenen Zustand ist schlecht. Beenden Sie einen monitor vor dem code, dass die Oberflächen der geschützten Bearbeiten Sie wichtige Benutzer-Daten ist noch schlimmer. Menschen handeln, wie den Abbruch von threads ist schlecht, weil Sie die Blätter Griffe zugeordnet, aber das eigentliche problem ist, dass es oft Sie befreit zu früh.
InformationsquelleAutor Tudor
Setzen Sie den thread in einem eigenen Prozess. Wenn Sie wollen, es zu stoppen, kill den Prozess.
Nur sicher Weg, um zu töten ein thread. Abbruch eines Threads kann stark destabilisieren, einen Prozess verlieren und Benutzer-Daten. Es gibt keine Möglichkeit zu vermeiden "verlieren Benutzer Daten" - Szenario, ist wenn Sie wirklich, wirklich brauchen, um in der Lage zu töten, einen thread, der könnte etwas werden. Die einzige Möglichkeit zur Vermeidung einer Destabilisierung des Prozesses, der Aufruf für den Abbruch ist, um Ihnen verschiedene Prozesse ganz.
Sie scheinen schrecklich sicher von selbst. Du bist ein Skript ausgeführt wird; Woher weißt du, dass der Autor des scripts hat nicht code gibt, destabilisieren den Prozess oder verlieren Benutzer Daten bei einer Unterbrechung?
verschiedene Prozesse müssen nicht unbedingt ausgeführt werden, die verschiedenen Baugruppen. Zum Beispiel
myprogram.exe
könnte einen neuen Prozess starten läuftmyprogram.exe
.das mag wahr sein, aber es gibt auch eine Kehrseite gibt. Im Allgemeinen wollen Sie nicht nur gehen, um zu töten Prozesse. Eher Sie wollen, senden Sie ein signal oder eine Nachricht, Ihnen zu sagen, Sie zu stoppen. Das ist ziemlich wichtig, wenn der Prozess der Verwaltung einige reasource, so dass Sie es wiederherstellen können Sie die Ressource auf ein beständiger Zustand. Für einige Ressourcen (wie Datei-locks oder Semaphore) das OS kann resotre Sie (möglicherweise auszusetzen einige andere Ressource in einem inconsistant Staat), aber nicht alle und die Nebenwirkungen sind im Allgemeinen undesireable.
Gut, sicher. Aber wenn Sie haben die Fähigkeit zur Steuerung von der Prozess höflich, dann sicherlich haben Sie auch die Möglichkeit der Steuerung von thread höflich. Wenn man kann Aufbau einer control-system, dann mit allen Mitteln tun; ich Verstand die Frage "aber was mache ich, wenn ich nicht control code, aber dennoch möchte ich es beenden, jetzt?"
InformationsquelleAutor Eric Lippert