Hoe stop ik een terminalproces met code inclusief threading?

Ik gebruik threading om meerdere functies tegelijkertijd uit te voeren met als doel weergegevens van meerdere websites te halen. Ik heb deze programma’s via de Linux-terminal uitgevoerd, maar kan ze niet annuleren door op ctrl C te drukken. Ik wil ze voor onbepaalde tijd laten draaien, en als zodanig wil ik geen eindtijd toevoegen, maar liever annuleer ze indien nodig. Weet iemand waarom ctrl C ze niet annuleert en hoe dit op te lossen?


Antwoord 1, autoriteit 100%

Daemon-threads

Het kan verleidelijk zijn om eenvoudig daemon-threads te gebruiken om dit probleem op te lossen, een python-uitvoering stopt wanneer alleendaemon-threads over zijn, en zal ze niettoestaan om op te schonen mooi op. De documentennoemen dit duidelijk:

Daemon-threads worden abrupt gestopt bij afsluiten. Hun bronnen (zoals open bestanden, databasetransacties, enz.) worden mogelijk niet correct vrijgegeven. Als je wilt dat je threads netjes stoppen, maak ze dan niet-demonisch en gebruik een geschikt signaleringsmechanisme zoals een Event.

Laten we hun advies opvolgen en een Evenement gebruiken.

Een evenement gebruiken

Een gebeurtenis is een eenvoudige vlag die veilig kan worden ingesteld en gelezen in threads. In dit geval zullen we een evenement in de hoofdthread maken, een nieuwe thread spawnen om wat werk te doen en naar die gebeurtenisvlag luisteren voor het geval het niet meer werkt.

import threading
ended = threading.Event()
def do_work():
    while not ended.is_set():
        # Do your repeated work
        pass
# Let's create and start our worker thread!
new_thread = threading.Thread(target=do_work)
new_thread.start()
try:
    while not ended.is_set():
        ended.wait(1)
except (KeyboardInterrupt, SystemExit):
    print("Cancelling")
    ended.set()

Het poging / vangstblok hier loopt in de hoofddraad, luisterend voor een KeyboardInterruptof SystemExitUitzondering. Als het een vangt, zal het de stoppedvlag instellen, waardoor de thread zijn huidige lus-iteratie kan voltooien en een opruiming uitvoeren die het nodig heeft.


Antwoord 2, Autoriteit 33%

  1. Gebruik Ctrl + BreakKEY COMBO.
  2. Druk op Ctrl + Z. Dit zal geen programma stoppen, maar keert u de opdrachtprompt terug. Doe dan ps -ax | grep *%program_name%*. Zoek de lijn die overeenkomt met de ene Yopu wil stoppen. Het eerste integer in de rij wordt programma-ID. Doen kill -9 %id%om het eindelijk te stoppen.
  3. Als het programma ook veel bronnen eet, kunt u top-opdracht in een afzonderlijke terminal gebruiken om de ID sneller te bekijken.

referentie

Other episodes