我正在用 python 开发一个多线程应用程序。我有以下情况。
- 有 2-3 个生产者线程与 DB 通信并获取一些大块数据并将它们填充到队列中
- 有一个中间 worker 将生产者线程获取的大块分成较小的 block ,并将它们填充到另一个队列中。
- 有 5 个消费者线程消费中间工作线程创建的队列。
- 数据源的对象由生产者线程通过它们的 API 访问。这些数据源是完全独立的。因此,这些生产者只了解数据源对象应该给出的数据是否存在。
- 我创建了这三种类型的线程,并通过调用 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/