Skip to main content
 首页 » 编程设计

python之如何在多线程 python 应用程序中创建全局错误处理程序

2025年05月04日21Leo_wl

我正在用 python 开发一个多线程应用程序。我有以下情况。

  1. 有 2-3 个生产者线程与 DB 通信并获取一些大块数据并将它们填充到队列中
  2. 有一个中间 worker 将生产者线程获取的大块分成较小的 block ,并将它们填充到另一个队列中。
  3. 有 5 个消费者线程消费中间工作线程创建的队列。
  4. 数据源的对象由生产者线程通过它们的 API 访问。这些数据源是完全独立的。因此,这些生产者只了解数据源对象应该给出的数据是否存在。
  5. 我创建了这三种类型的线程,并通过调用 join() 使主线程等待这些线程完成。

现在对于这样的设置,我需要一个通用的错误处理程序,它可以检测任何线程的故障、任何异常并决定要做什么。例如,如果我在启动我的应用程序后按 ctrl+c,主线程会死掉,但生产者、消费者线程会继续运行。我希望一旦按下 ctrl+c,整个应用程序就应该关闭。同样,如果数据源模块中发生了一些数据库错误,那么生产者线程应该得到通知。

这是我到目前为止所做的:

我创建了一个 ThreadManager 类,它的对象被传递给所有线程。我已经编写了一个错误处理程序方法并将其传递给 sys.excepthook。这个处理程序应该捕获异常、错误,然后它应该调用 ThreadManager 类的方法来控制正在运行的线程。这是片段:

class Producer(threading.Thread): 
    .... 
    def produce(): 
        data = dataSource.getData() 
 
class DataSource: 
    .... 
    def getData(): 
        raise Exception("critical") 
 
def customHandler(exceptionType, value, stackTrace): 
     print "In custom handler" 
 
sys.excepthook = customHandler 

现在当生产者类的线程调用DataSource类的getData()时,会抛出异常。但是我的 customHandler 方法从未捕获到此异常。

我错过了什么?同样在这种情况下,我可以应用什么其他策略?请帮忙。感谢您有足够的耐心阅读所有这些:)

请您参考如下方法:

你需要的是一个装饰器。本质上,您是在修改原始函数并将其放入 try-except 中:

def exception_decorator(func): 
    def _function(*args): 
        try: 
            result = func(*args) 
        except: 
            print('*** ESC default handler ***') 
            os._exit(1) 
        return result 
    return _function 

如果您的线程函数名为 myfunc,则在您的函数定义上方添加以下行

@exception_decorator 
def myfunc(): 
    pass;