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

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

  • 现在,对于这样的设置,我想要一个通用的错误处理程序,该处理程序可以检测任何线程,任何异常的失败并确定要执行的操作。例如,如果我在启动应用程序后按ctrl + c,则主线程死亡,但生产者,使用者线程继续运行。我希望一旦按下ctrl + c,就应该关闭整个应用程序。同样,如果在数据源模块中发生一些DB错误,则生产者线程应该得到通知。

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

    我创建了一个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;
    

    关于python - 如何在多线程python应用程序中创建全局错误处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13681370/

    10-11 20:44
    查看更多