繁体   English   中英

监控线程

[英]Monitoring threads

我有一个产生多个线程的应用程序。 每个线程都有相当复杂的逻辑。 有时会出现死锁或其他问题,我想得知Thread不再处于“健康”状态。

我想到的选择是:

  1. 记录和监视日志
  2. 从每个线程更新内存中的共享对象(例如,以线程ID为键和状态结构的字典:确定,时间跨度,然后在单独的线程中观察该字典,如果线程X分钟未更新其状态,则表示存在某种情况出错)

但是我感觉这不是最好的解决方案。 是否有监视线程的良好实践? 也许线程本身可以使用时间戳更新它的全局状态,并且进程可以访问该信息?

在此,我将概述一些想法。

1使您的代码更健壮

显然,保持线程健康的最简单方法是解决所有这些不正常的状态,如果您陷入死锁,请更适当地使用锁和信号灯,调试死锁发生的原因并找到解决这些不良情况的方法。

2代理和错误处理程序

与上述相关,如果您可以正确地识别这些问题而又不能解决这些问题,则可以建立一个线程可以知道其处于危险状态的系统,并实施一个可以解决这些问题的系统。线程可以说出消息给主线程,说它处于坏状态,然后主线程可以关闭受影响的线程,从设置的“安全状态”启动一个新线程,然后尝试从那里继续。 像Elixir这样的基于多进程的语言都非常喜欢这种保护方式。

3记录/轮询

如果确实没有办法让您知道发生了什么/如何进行(有时总是太难了),那么在设定的时间范围内更新共享资源的线程就很容易实现。 每隔一分钟让线程更新一次浮点数,精确到自上一次更新浮点数以来的时间,让主线程每隔几分钟检查一次该浮点数((如果您的线程太忙而无法按时更新它,请留大量空间) 。 如果说5分钟没有更新,那么您可以肯定地确定您的线程已死锁。 如果您希望事后能够看到此消息,那么您也可以将这些更新消息复制到日志文件中,并使用堆栈跟踪该时间,以查看其卡在哪里

结论

总而言之,如果您可以修复/可靠地确定何时发生错误/受感染状态,则可以编写代码来解决这些不良状态,如果您不能这样做,那么下一个目标应该是达到目标去做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM