Dalam Python, pengaturcaraan berbilang benang membolehkan anda melaksanakan tugasan secara serentak. Walau bagaimanapun, pengendalian pengecualian dalam konteks berbilang benang boleh mencabar. Artikel ini menangani isu khusus: menangkap pengecualian yang berlaku dalam urutan anak daripada urutan induk.
Masalah timbul kerana urutan anak beroperasi secara bebas dengan konteks dan susunannya sendiri. Pengecualian yang dilemparkan dalam benang anak tidak dapat dilihat dengan serta-merta kepada benang induk. Blok percubaan-kecuali tradisional dalam urutan induk, seperti yang ditunjukkan di bawah, tidak akan berfungsi:
try: threadClass.start() ##### **Exception takes place here** except: print "Caught an exception"
Untuk menangani perkara ini, kami boleh menggunakan penghantaran mesej. Urutan anak boleh menghantar maklumat pengecualian kepada urutan induk menggunakan struktur data yang dikongsi seperti baris gilir.
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()
Dalam contoh ini:
Menggunakan penghantaran mesej membolehkan komunikasi pengecualian yang cekap antara urutan.
Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pengecualian Benang Kanak-kanak dalam Benang Induk dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!