我正在用 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 方法捕获。
我错过了什么?同样在这种情况下,我还可以应用哪些其他策略?请帮忙。感谢您有足够的耐心阅读所有这些:)