Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menamatkan Benang Lari dengan Anggun dan Berpaksa dalam Python?
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.
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()
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)
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!