libuv工作线程或工作队列运行状况检查?

在libuv中,最终可能会在工作线程中绑定太多的工作或错误的代码。 有一个简单的函数可以检查工作线程或线程队列的健康状况吗? 它不一定是100%确定性的,毕竟不可能确定工作线程挂在慢代码还是无限循环上。

所以下面的启发式都是好的:

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

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

这个函数在libuv本身并不存在,我也不知道任何提供这样的东西的OSS。

在杀死机制方面,没有一个是libuv,但http://nikhilm.github.io/uvbook/threads.html#core-thread-operationsbuild议:

一个精心devise的程序将有一种方法来终止已经开始执行的长期运行的工人。 这样的工作人员可以定期检查只有主进程设置为信号终止的variables。

如果这是为nodejs,将简单的监视线程呢? 我不知道如何获取有关事件队列内部的信息,但是您可以在事件队列中注入一个跟踪器,以监视线程是否正在及时运行。 (这个措施不是通过尚未运行的线程数来加载,而是通过线程是否按时运行来实现的,同样的东西,种类。)

一个监视器线程可以自行重新排队,并检查它是否至less每10毫秒被调用一次(或者允许最大累积阻塞时间ms)。 由于nodej运行线程循环,如果监视线程按时运行,它告诉我们所有其他线程都有机会在同一个10ms窗口内运行。 像(在节点):

// 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(); 

限制警报信息并支持清理closures是给读者的一个练习。