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

标签 python multithreading error-handling

我正在用 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;

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

相关文章:

ios - 在 Xcode 7 中从 Unity 构建 iOS 时出错

python - 在 python 日志记录中显示线程 native_id

c++ - 如何创建一个新线程并在一段时间后终止它?

python - 使用 Matplotlib、PyQt 和 Threading 进行实时绘图以 python 崩溃结束

c# - 跨线程操作无效 : Control 'listBox1' accessed from a > thread other than the thread it was created on

ios - 带有错误映射的 RestKit PUT 请求

python - 使用 Python 在终端中生成音频铃

android - python sl4a unicode (Android)

python - signal.spectrogram 找到给定段的最大频率

error-handling - 终端错误 : no such file or directory:/dev/fd/12export - thread 'main' panicked at 'failed printing to stdout: Broken pipe (os error 32)