Menangkap Pengecualian Thread dalam Python Multithreading
Dalam Python, multithreading membenarkan pelaksanaan serentak berbilang tugas. Walau bagaimanapun, pengendalian pengecualian dalam urutan kanak-kanak menimbulkan cabaran, kerana pengecualian berlaku dalam konteks yang berasingan.
Masalah Diterangkan
Apabila benang kanak-kanak melontar pengecualian, ia tidak terus terperangkap dalam benang induk. Kaedah thread_obj.start() kembali serta-merta, manakala urutan anak beroperasi secara bebas.
Penyelesaian Menggunakan Queue dan sys.exc_info()
Untuk menyampaikan maklumat pengecualian kembali ke utas induk, kita boleh menggunakan baris gilir untuk menghantar mesej. Berikut ialah contoh:
import sys import threading import queue class ExcThread(threading.Thread): def __init__(self, bucket): threading.Thread.__init__(self) self.bucket = bucket def run(self): try: raise Exception('An error occured here.') except Exception: self.bucket.put(sys.exc_info()) def main(): bucket = queue.Queue() thread_obj = ExcThread(bucket) thread_obj.start() while True: try: exc = bucket.get(block=False) except queue.Empty: pass else: exc_type, exc_obj, exc_trace = exc # deal with the exception print(exc_type, exc_obj) print(exc_trace) thread_obj.join(0.1) if thread_obj.isAlive(): continue else: break if __name__ == '__main__': main()
Penjelasan:
Pendekatan ini membenarkan urutan induk untuk mengendalikan pengecualian daripada urutan kanak-kanak dengan berkesan.
Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pengecualian daripada Benang Kanak-Kanak dalam Python Multithreading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!