Node js如何调度作业(非阻塞)



我想安排作业每x秒运行一次,这样才能完成。一个例子是每10秒ping一次服务器,但所有这些都应该是异步的,所以没有其他功能停止。

这取决于你所说的"其它功能都不停止";。ping服务器已经是非阻塞和异步的了,因为nodejs中的所有网络都是这样的。

所以,代码是这样的:

setInterval(() => {
// put code to do the ping here
}, 5000);

不会阻塞服务器的其余部分,因为代码对ping做的操作已经是非阻塞的了。

但是,服务器的其余部分可能会阻止setInterval()按时启动。如果您在服务器中执行一些长时间运行的阻塞代码,那么setInterval()计时器回调在该代码完成之前不会发生,并且可能会从计划运行时延迟。由于nodejs是单线程和事件驱动的,所以它无法处理下一个计时器事件,直到上一个事件(无论是什么(完成执行其代码的阻塞部分。

如果你想绝对确保你的定时器总是在非常接近它应该运行的时候运行,你要么必须确保你的程序的其余部分永远不会阻塞很长时间,要么你需要把定时器移到另一个Javascript线程或进程中,并通过消息传递回主线程。

您可以在现有的nodejs进程中使用WorkerThread,也可以使用child_process模块运行一个单独的子程序来为您执行ping。Nodejs具有内置消息,这些消息将从WorkerThread或child_process返回主程序或从主程序返回。

您需要利用多线程来生成非阻塞代码。我建议使用内置的node.js多线程包worker_threads。https://nodejs.org/api/worker_threads.html

最新更新