Maison >développement back-end >Tutoriel Python >Comment tuer gracieusement et de force un fil de discussion en Python ?

Comment tuer gracieusement et de force un fil de discussion en Python ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 02:48:19275parcourir

How to Gracefully and Forcibly Kill a Thread in Python?

Tuer un fil de discussion en Python : un guide

En Python, l'arrêt d'un fil de discussion est généralement déconseillé en raison de problèmes potentiels de ressources. Cependant, il existe des cas où une terminaison forcée est nécessaire.

Approche standard : indicateurs de sortie et objets d'événement

La meilleure pratique consiste à définir un indicateur de sortie que les threads vérifient périodiquement, permettant une sortie en douceur. Par exemple, l'utilisation d'une classe StoppableThread avec un indicateur exit_request permet aux threads de vérifier la terminaison et de se terminer en conséquence.

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

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

    def stopped(self):
        return self._stop_event.is_set()

Terminaison forcée : interrompre le flux d'exécution

Dans les cas extrêmes, terminaison directe du thread est nécessaire. Cependant, cette approche comporte des risques si le thread contient des ressources critiques.

Une méthode consiste à déclencher une exception dans le thread à l'aide de la fonction _async_raise. Cela déclenche une exception de manière asynchrone, permettant au thread de l'attraper et de la gérer avec élégance.

def _async_raise(tid, exctype):
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid),
                                                     ctypes.py_object(exctype))
    ...

class ThreadWithExc(threading.Thread):
    def raise_exc(self, exctype):
        _async_raise(self._get_my_tid(), exctype )

Précautions et considérations

La suppression abrupte des threads peut entraîner des fuites de ressources ou une exécution incomplète des tâches. Il est donc essentiel d’employer judicieusement l’approche de résiliation forcée et de toujours privilégier les sorties en douceur. De plus, la méthode _async_raise peut ne pas toujours être efficace si le thread effectue des opérations intensives.

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!

Déclaration:
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