Dalam Python, penamatan benang biasanya tidak digalakkan disebabkan masalah sumber yang berpotensi. Walau bagaimanapun, terdapat keadaan apabila penamatan paksa diperlukan.
Amalan terbaik melibatkan menetapkan bendera keluar yang diperiksa secara berkala, membolehkan keluar dengan anggun. Contohnya, menggunakan kelas StoppableThread dengan bendera exit_request membenarkan urutan untuk menyemak penamatan dan keluar dengan sewajarnya.
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()
Dalam kes yang melampau, penamatan rangkaian terus adalah perlu. Walau bagaimanapun, pendekatan ini membawa risiko jika utas mempunyai sumber kritikal.
Satu kaedah melibatkan menaikkan pengecualian dalam utas menggunakan fungsi _async_raise. Ini menimbulkan pengecualian secara tidak segerak, membolehkan benang menangkap dan mengendalikannya dengan anggun.
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 )
Membunuh benang secara tiba-tiba boleh mengakibatkan kebocoran sumber atau pelaksanaan tugas yang tidak lengkap. Oleh itu, adalah penting untuk menggunakan pendekatan penamatan paksa dengan bijak dan sentiasa memilih jalan keluar yang anggun. Selain itu, kaedah _async_raise mungkin tidak selalu berkesan jika utas menjalankan operasi intensif.
Atas ialah kandungan terperinci Bagaimana untuk Membunuh Benang dengan Anggun dan Secara Paksa dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!