在libuv中,最终可能会因为工作量太大或代码错误而占用工作线程。是否有一个简单的函数可以检查工作线程或线程队列的运行状况?它不一定是100%确定性的,毕竟不可能确定工作线程是挂在慢速代码还是无限循环上。
因此,以下任何启发式方法都会很好:
尚未处理的排队项目数。如果这个太大,则可能意味着工作线程忙或挂。
libuv是否有任何线程查杀机制,如果工作线程在n秒内没有检查,它会被终止吗?
答案 0 :(得分:1)
libuv本身不存在该函数,我不知道任何OSS提供类似的东西。
就杀戮机制而言,没有任何内容存在于libuv中,但http://nikhilm.github.io/uvbook/threads.html#core-thread-operations建议:
精心设计的程序可以终止长时间运行 已经开始执行的工人。这样的工人可以 定期检查只有主进程设置的变量 信号终止。
答案 1 :(得分:-1)
如果这是针对nodejs的,那么一个简单的监听线程会做什么?我不知道如何获取有关事件队列内部的信息,但您可以将跟踪器注入事件队列以监视正在运行的线程。 (这不是通过尚未运行的线程数来加载,而是通过线程是否按时运行来加载。同样的事情,那种。)
监视器线程可以重新排队并检查它是否至少每10毫秒被调用一次(或者允许的最大累积阻塞ms)。由于nodej运行线程循环,如果监视器线程按时运行,它告诉我们所有其他线程都有机会在同一个10毫秒窗口内运行。像(在节点中):
// like Date.now(), but with higher precision
// the extra precision is needed to be able to track small delays
function dateNow() {
var t = process.hrtime();
return (t[0] + t[1] * 1e-9) * 1000;
}
var _lastTimestamp = dateNow(); // when healthMonitor ran last, in ms
var _maxAllowedDelay = 10.0; // max ms delay we allow for our task to run
function healthMonitor() {
var now = dateNow();
var delay = now - _lastTimestamp;
if (delaly > _maxAllowedDelay) {
console.log("healthMonitor was late:", delay, " > ", _maxAllowedDelay);
}
_lastTimestamp = now;
setTimeout(healthMonitor, 1);
}
// launch the health monitor and run it forever
// note: the node process will never exit, it will have to be killed
healthMonitor();
限制警报信息并支持干净关机是一项留给读者的练习。