Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Menangkap Pengecualian Benang Kanak-kanak dalam Benang Induk dalam Python?

Bagaimana untuk Menangkap Pengecualian Benang Kanak-kanak dalam Benang Induk dalam Python?

Susan Sarandon
Lepaskan: 2024-11-09 12:06:02
asal
185 orang telah melayarinya

How to Catch Child Thread Exceptions in a Parent Thread in Python?

Mengendalikan Pengecualian dalam Aplikasi Python Berbilang Benang

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"
Salin selepas log masuk

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()
Salin selepas log masuk

Dalam contoh ini:

  1. Timba baris gilir dicipta untuk berkongsi pengecualian maklumat.
  2. ExThread dimulakan dengan rujukan kepada baldi.
  3. Urut utama sentiasa menyemak pengecualian dalam baris gilir.
  4. Jika pengecualian ditemui, utas utama benang boleh mengendalikannya dengan sewajarnya.

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan