Penamatan Benang Anggun
Menamatkan utas secara tiba-tiba biasanya tidak digalakkan, terutamanya dalam Python. Ia boleh membawa kepada kebocoran sumber atau rasuah data jika operasi kritikal terganggu.
Pendekatan Disyorkan
Kaedah pilihan ialah menetapkan bendera atau semafor untuk menunjukkan bahawa urutan harus keluar. Urutan harus menyemak bendera ini secara berkala dan keluar dengan anggun jika ia ditetapkan.
Contoh:
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 contoh ini, henti panggilan() untuk menandakan urutan itu keluar, dan gunakan join() untuk menunggu sehingga ia selesai dengan anggun.
Dipaksa Penamatan
Dalam kes luar biasa, anda mungkin perlu menamatkan rangkaian secara paksa. Walau bagaimanapun, ini harus dianggap sebagai pilihan terakhir.
Kaedah Penamatan Paksa:
import ctypes import inspect 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 _get_my_tid(self): if not self.is_alive(): # Note: self.isAlive() on older version of Python raise threading.ThreadError("the thread is not active") # do we have it cached? if hasattr(self, "_thread_id"): return self._thread_id # no, look for it in the _active dict for tid, tobj in threading._active.items(): if tobj is self: self._thread_id = tid return tid raise AssertionError("could not determine the thread's id") def raise_exc(self, exctype): _async_raise(self._get_my_tid(), exctype )
Kaedah ini bergantung pada fungsi PyThreadState_SetAsyncExc untuk menimbulkan pengecualian dalam sesuatu tertentu benang. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kaedah ini tidak boleh dipercayai sepenuhnya dan mungkin gagal jika urutan berada dalam panggilan sistem di luar penterjemah Python.
Awas:
Atas ialah kandungan terperinci Bagaimana Menamatkan Benang dalam Python dengan Anggun, dan Bilakah Penamatan Paksa Diperlukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!