Maison > développement back-end > Tutoriel Python > Un thread Python en cours d'exécution peut-il être arrêté de manière gracieuse ou forcée ?

Un thread Python en cours d'exécution peut-il être arrêté de manière gracieuse ou forcée ?

Linda Hamilton
Libérer: 2025-01-01 09:45:10
original
694 Les gens l'ont consulté

Can a Running Python Thread Be Stopped Gracefully or Forcedly?

Un thread en cours d'exécution peut-il être interrompu brusquement ?

Bien que ce ne soit généralement pas une bonne approche, il est possible de terminer brusquement un thread en cours d'exécution en Python . Cependant, cette approche n'est pas universellement applicable.

Considérations pour une résiliation gracieuse

Considérez les scénarios suivants :

  • Ressource critique détenue par le le fil doit être correctement fermé.
  • Plusieurs fils de discussion créés par le fil cible qui nécessitent également résiliation.

Pour ces cas, il est préférable d'utiliser un indicateur exit_request vérifié régulièrement par le thread cible pour déclencher une sortie si nécessaire.

Exemple de code pour une résiliation gracieuse :

import threading

class StoppableThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._stop_event = threading.Event()

    def stop(self):
        self._stop_event.set()

    def stopped(self):
        return self._stop_event.is_set()
Copier après la connexion

Appelez stop() lorsque le thread doit se terminer, puis join() pour garantir le bon fonctionnement terminaison.

Forcer la terminaison du thread

Dans certains cas, la terminaison forcée du thread peut être nécessaire. Considérez les appels de bibliothèques externes qui introduisent de longs délais.

Lèvement d'exceptions à l'aide de ThreadWithExc

La classe ThreadWithExc permet de déclencher des exceptions dans un thread à partir d'un autre thread :

def _async_raise(tid, exctype):
    # Raises an Exception (exctype) in thread with ID (tid)
    if not inspect.isclass(exctype):
        raise TypeError("Only types can be raised (not instances)")

class ThreadWithExc(threading.Thread):
    def raise_exc(self, exctype):
        # Raises exctype in the context of the current thread
        _async_raise(self._get_my_tid(), exctype)
Copier après la connexion

Notez que cette méthode n'est pas fiable si le thread est en dehors de l'interpréteur Python. Assurez-vous que le thread intercepte l'exception spécifique pour effectuer le nettoyage nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal