Maison > développement back-end > Tutoriel Python > Comment puis-je terminer avec élégance et force un thread en cours d'exécution en Python ?

Comment puis-je terminer avec élégance et force un thread en cours d'exécution en Python ?

Linda Hamilton
Libérer: 2024-12-25 15:32:24
original
859 Les gens l'ont consulté

How Can I Gracefully and Forcefully Terminate a Running Thread in Python?

Façons de terminer un fil de discussion en cours d'exécution

Contexte

Bien qu'il soit généralement préférable de demander aux fils de se terminer correctement, il existe des situations où une résiliation brutale est nécessaire . Cet article explore les méthodes permettant de mettre fin aux threads même lorsqu'ils ne sont pas conçus pour cela.

Résiliation gracieuse

L'approche recommandée consiste à utiliser un indicateur d'arrêt que les threads vérifient périodiquement pour déterminer s'ils doivent se terminer. . Cela permet aux threads de libérer des ressources et d'effectuer un nettoyage avant de se terminer.

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

Résiliation forcée

Dans de rares cas, il peut être nécessaire de mettre fin de force à un thread. Ceci peut être réalisé en utilisant la fonction _async_raise :

def _async_raise(tid, exctype):
    if not inspect.isclass(exctype):
        raise TypeError("Only types can be raised (not instances)")
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid),
                                                     ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("invalid thread id")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), None)
        raise SystemError("PyThreadState_SetAsyncExc failed")

class ThreadWithExc(threading.Thread):
    def raise_exc(self, exctype):
        _async_raise(self._get_my_tid(), exctype)
Copier après la connexion

Mises en garde

Notez que la résiliation forcée peut laisser les ressources dans un état instable. Utilisez cette option uniquement lorsque la résiliation gracieuse n'est pas disponible ou lorsque le thread bloque activement le programme.

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