libuv工作线程或工作队列健康检查?

时间:2013-12-12 23:25:28

标签: c++ multithreading node.js events libuv

在libuv中,最终可能会因为工作量太大或代码错误而占用工作线程。是否有一个简单的函数可以检查工作线程或线程队列的运行状况?它不一定是100%确定性的,毕竟不可能确定工作线程是挂在慢速代码还是无限循环上。

因此,以下任何启发式方法都会很好:

  • 尚未处理的排队项目数。如果这个太大,则可能意味着工作线程忙或挂。

  • libuv是否有任何线程查杀机制,如果工作线程在n秒内没有检查,它会被终止吗?

2 个答案:

答案 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();

限制警报信息并支持干净关机是一项留给读者的练习。