Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menamatkan Benang Lari dengan Anggun dan Berpaksa dalam Python?

Bagaimanakah Saya Boleh Menamatkan Benang Lari dengan Anggun dan Berpaksa dalam Python?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 15:32:24863semak imbas

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

Cara-Cara Menamatkan Benang Yang Berlari

Latar Belakang

Walaupun pada umumnya lebih disukai untuk meminta urutan untuk keluar dengan baik, terdapat situasi di mana penamatan secara tiba-tiba diperlukan . Artikel ini meneroka kaedah untuk menamatkan benang walaupun ia mungkin tidak direka bentuk untuknya.

Penamatan Anggun

Pendekatan yang disyorkan ialah menggunakan bendera berhenti yang diperiksa secara berkala untuk menentukan sama ada ia harus keluar . Ini membolehkan urutan mengeluarkan sumber dan melakukan pembersihan sebelum ditamatkan.

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()

Penamatan Paksa

Dalam kes yang jarang berlaku, anda mungkin perlu menamatkan rangkaian secara paksa. Ini boleh dicapai menggunakan fungsi _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)

Kaveat

Perhatikan bahawa penamatan secara paksa boleh menyebabkan sumber dalam keadaan tidak stabil. Hanya gunakan pilihan ini apabila penamatan anggun tidak tersedia atau apabila utas menyekat program secara aktif.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menamatkan Benang Lari dengan Anggun dan Berpaksa dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn