Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menangkap Pengecualian daripada Benang Kanak-Kanak dalam Python Multithreading?

Bagaimana untuk Menangkap Pengecualian daripada Benang Kanak-Kanak dalam Python Multithreading?

Patricia Arquette
Patricia Arquetteasal
2024-11-22 10:49:11781semak imbas

How to Catch Exceptions from Child Threads in Python Multithreading?

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:

  1. Benang kanak-kanak (ExcThread) menimbulkan pengecualian.
  2. Dalam kaedah "lari" benang kanak-kanak, maklumat pengecualian diletakkan ke dalam baris gilir menggunakan sys.exc_info().
  3. Dalam urutan induk (utama), gelung sentiasa menyemak baris gilir untuk sebarang pengecualian.
  4. Jika pengecualian ditangkap dalam gelung, ia akan dicetak untuk pemeriksaan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn